From a52788e72f6a0fe3d57d33b41a69b13116a06856 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sat, 30 Sep 2023 17:05:39 +0100 Subject: [PATCH] Added shared TimerBar composable function --- .../presentation/components/Common.kt | 70 +++++++++++++++-- .../presentation/passes/PassesDialog.kt | 4 +- .../presentation/passes/PassesScreen.kt | 76 ++++++------------- .../look4sat/presentation/radar/RadarData.kt | 7 +- .../presentation/radar/RadarScreen.kt | 35 ++------- .../presentation/radar/RadarViewModel.kt | 2 +- .../main/res/drawable/ic_notifications.xml | 9 +++ gradle.properties | 1 - 8 files changed, 111 insertions(+), 93 deletions(-) create mode 100644 app/src/main/res/drawable/ic_notifications.xml diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/components/Common.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/components/Common.kt index ca0224db..63b23010 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/components/Common.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/components/Common.kt @@ -4,11 +4,17 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.widget.Toast +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedButton @@ -17,13 +23,65 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.composed import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.PlatformTextStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.rtbishop.look4sat.R +import com.rtbishop.look4sat.presentation.MainTheme + +@Composable +@Preview(showBackground = true) +private fun TimerBarPreview() { + MainTheme { TimerBar(45555, "Satellite", "88:88:88", R.drawable.ic_filter) {} } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun TimerBar(id: Int, name: String, time: String, iconId: Int, action: () -> Unit) { + val barHeightMod = Modifier.height(48.dp) + val maxSizeMod = Modifier.fillMaxSize() + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + ElevatedCard(modifier = barHeightMod.weight(1f)) { + Row( + modifier = maxSizeMod.padding(horizontal = 6.dp, vertical = 4.dp), + verticalAlignment = Alignment.Top + ) { + Text( + text = "Id:$id - ", + modifier = Modifier.width(82.dp), + textAlign = TextAlign.End, + color = MaterialTheme.colorScheme.primary + ) + Text( + text = name, + fontWeight = FontWeight.Medium, + modifier = Modifier.basicMarquee(iterations = Int.MAX_VALUE) + ) + } + } + ElevatedCard(modifier = barHeightMod) { + Text( + text = time, + fontSize = 32.sp, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp), + style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false)) + ) + } + CardIcon(onClick = { action() }, iconId = iconId) + } +} @Composable fun CardButton(onClick: () -> Unit, text: String, modifier: Modifier = Modifier) { @@ -60,6 +118,6 @@ fun gotoUrl(context: Context, url: String) { context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) } -fun Modifier.onClick(onClick: () -> Unit): Modifier = composed { - clickable(remember { MutableInteractionSource() }, null) { onClick() } -} +//fun Modifier.onClick(onClick: () -> Unit): Modifier = composed { +// clickable(remember { MutableInteractionSource() }, null) { onClick() } +//} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesDialog.kt index c5570c0e..4855e7c1 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesDialog.kt @@ -110,7 +110,7 @@ fun FilterDialog( Slider( value = hoursValue.intValue.toFloat(), onValueChange = { hoursValue.intValue = it.toInt() }, - valueRange = 1f..168f, + valueRange = 1f..96f, colors = SliderDefaults.colors(inactiveTrackColor = MaterialTheme.colorScheme.onSurfaceVariant) ) Row(horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.Bottom) { @@ -133,7 +133,7 @@ fun FilterDialog( Slider( value = elevationValue.intValue.toFloat(), onValueChange = { elevationValue.intValue = it.toInt() }, - valueRange = 0f..90f, + valueRange = 0f..60f, colors = SliderDefaults.colors(inactiveTrackColor = MaterialTheme.colorScheme.onSurfaceVariant) ) LazyVerticalGrid( diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt index fecee83c..270c3112 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passes/PassesScreen.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -17,7 +16,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -27,8 +25,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.PlatformTextStyle -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -42,6 +38,7 @@ import com.rtbishop.look4sat.domain.predict.OrbitalPass import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.PullRefreshIndicator import com.rtbishop.look4sat.presentation.components.PullRefreshState +import com.rtbishop.look4sat.presentation.components.TimerBar import com.rtbishop.look4sat.presentation.components.pullRefresh import com.rtbishop.look4sat.presentation.components.rememberPullRefreshState import java.text.SimpleDateFormat @@ -56,58 +53,22 @@ fun PassesScreen(uiState: PassesState, navToRadar: (Int, Long) -> Unit) { }) val toggleDialog = { uiState.takeAction(PassesAction.ToggleFilterDialog) } if (uiState.isDialogShown) { - FilterDialog(uiState.hours, uiState.elevation, uiState.modes, toggleDialog) { hours, elevation, modes -> + FilterDialog(uiState.hours, uiState.elevation, uiState.modes, toggleDialog + ) { hours, elevation, modes -> uiState.takeAction(PassesAction.ApplyFilter(hours, elevation, modes)) } } Column(modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) { - TopBar(nextId = uiState.nextId, nextName = uiState.nextName, nextTime = uiState.nextTime, toggleDialog) + TimerBar( + id = uiState.nextId, + name = uiState.nextName, + time = uiState.nextTime, + iconId = R.drawable.ic_filter + ) { toggleDialog() } PassesCard(refreshState, uiState.isRefreshing, uiState.itemsList, navToRadar) } } -@Composable -@Preview(showBackground = true) -private fun TopBarPreview() { - MainTheme { TopBar(nextId = 45555, nextName = "Stuff", nextTime = "88:88:88") {} } -} - -@Composable -private fun TopBar(nextId: Int, nextName: String, nextTime: String, toggleDialog: () -> Unit) { - ElevatedCard(modifier = Modifier.height(48.dp)) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxSize() - ) { - Icon( - painter = painterResource(id = R.drawable.ic_sputnik), - contentDescription = null, - modifier = Modifier.padding(12.dp) - ) - Column(verticalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.weight(1f)) { - Text( - text = "AOS - Id:$nextId", - color = MaterialTheme.colorScheme.primary, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - Text(text = nextName, fontWeight = FontWeight.Medium, maxLines = 1, overflow = TextOverflow.Ellipsis) - } - Text( - text = nextTime, - fontSize = 32.sp, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.primary, - style = TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = false)) - ) - IconButton(onClick = { toggleDialog() }) { - Icon(painter = painterResource(id = R.drawable.ic_filter), contentDescription = null) - } - } - } -} - @Preview(showBackground = true) @Composable private fun PassPreview() { @@ -120,7 +81,9 @@ private fun PassPreview() { } @Composable -private fun Pass(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifier: Modifier = Modifier) { +private fun Pass( + pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifier: Modifier = Modifier +) { Surface(color = MaterialTheme.colorScheme.background, modifier = modifier) { Surface(modifier = Modifier .padding(bottom = 2.dp) @@ -189,7 +152,10 @@ private fun Pass(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifier: M modifier = Modifier.fillMaxWidth() ) { val deepTime = stringResource(id = R.string.pass_placeholder) - Text(text = if (pass.isDeepSpace) deepTime else sdf.format(Date(pass.aosTime)), fontSize = 15.sp) + Text( + text = if (pass.isDeepSpace) deepTime else sdf.format(Date(pass.aosTime)), + fontSize = 15.sp + ) LinearProgressIndicator( progress = if (pass.isDeepSpace) 1f else pass.progress, modifier = modifier @@ -197,7 +163,10 @@ private fun Pass(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifier: M .padding(top = 3.dp), trackColor = MaterialTheme.colorScheme.inverseSurface ) - Text(text = if (pass.isDeepSpace) deepTime else sdf.format(Date(pass.losTime)), fontSize = 15.sp) + Text( + text = if (pass.isDeepSpace) deepTime else sdf.format(Date(pass.losTime)), + fontSize = 15.sp + ) } } } @@ -207,7 +176,10 @@ private fun Pass(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifier: M @OptIn(ExperimentalFoundationApi::class) @Composable private fun PassesCard( - refreshState: PullRefreshState, isRefreshing: Boolean, passes: List, navToRadar: (Int, Long) -> Unit + refreshState: PullRefreshState, + isRefreshing: Boolean, + passes: List, + navToRadar: (Int, Long) -> Unit ) { ElevatedCard(modifier = Modifier.fillMaxSize()) { Box(Modifier.pullRefresh(refreshState)) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarData.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarData.kt index a8a0325d..72ad66e3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarData.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarData.kt @@ -17,6 +17,11 @@ */ package com.rtbishop.look4sat.presentation.radar +import com.rtbishop.look4sat.domain.predict.OrbitalPass import com.rtbishop.look4sat.domain.predict.OrbitalPos -data class RadarData(val orbitalPos: OrbitalPos, val satTrack: List = emptyList()) +data class RadarData( + val orbitalPass: OrbitalPass, + val orbitalPos: OrbitalPos, + val satTrack: List = emptyList() +) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt index 79cd7d24..8b9383f0 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarScreen.kt @@ -6,13 +6,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -23,45 +21,22 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.model.SatRadio +import com.rtbishop.look4sat.presentation.components.TimerBar @Composable fun RadarScreen() { val viewModel = viewModel(RadarViewModel::class.java, factory = RadarViewModel.Factory) - val currentPass = viewModel.getPass().collectAsState(null) - + val currentPass = viewModel.getPass().collectAsState(null).value + val id = currentPass?.catNum ?: 99999 + val name = currentPass?.name ?: "Satellite" Column(modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) { - ElevatedCard(modifier = Modifier.height(52.dp)) { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxSize() - ) { - IconButton(onClick = {}) { - Icon(painter = painterResource(id = R.drawable.ic_filter), contentDescription = null) - } - Column(verticalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.weight(1f)) { - Text(text = "Null") - Text(text = "Null") - } - Text( - text = "00:00:00", - fontSize = 36.sp, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.primary, - textAlign = TextAlign.End, - modifier = Modifier - .weight(1f) - .padding(bottom = 2.dp, end = 8.dp) - ) - } - } + TimerBar(id, name, "88:88:88", R.drawable.ic_notifications) {} ElevatedCard( modifier = Modifier .fillMaxSize() diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarViewModel.kt index 87b09292..23c14b50 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarViewModel.kt @@ -124,7 +124,7 @@ class RadarViewModel( val elevation = orbitalPos.elevation.toDegrees().round(1) networkReporter.reportRotation(server, port, azimuth, elevation) } - radarData.value = RadarData(orbitalPos, track) + radarData.value = RadarData(orbitalPass, orbitalPos, track) } } diff --git a/app/src/main/res/drawable/ic_notifications.xml b/app/src/main/res/drawable/ic_notifications.xml new file mode 100644 index 00000000..3b02d07c --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications.xml @@ -0,0 +1,9 @@ + + + diff --git a/gradle.properties b/gradle.properties index 4e4492d0..8ceb3f69 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,6 @@ android.enableJetifier=false android.enableR8.fullMode=true android.nonFinalResIds=true android.nonTransitiveRClass=true -android.suppressUnsupportedCompileSdk=34 android.useAndroidX=true kotlin.code.style=official kotlin.daemon.jvm.options=-Xmx4g