Dependencies, resources and code cleanup

This commit is contained in:
Arty Bishop committed 2025-12-27 15:01:33 +00:00
1 parent 68d35f0104
commit 007e6d8f9d
33 files changed
+133 -295

No files matched your search

@@ -1,4 +1,4 @@
package com.rtbishop.look4sat.presentation.bottomNav
package com.rtbishop.look4sat.presentation
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
@@ -17,21 +17,30 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.rtbishop.look4sat.presentation.MainTheme
import com.rtbishop.look4sat.presentation.aboutScreen.AboutScreen
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.presentation.entriesScreen.EntriesScreen
import com.rtbishop.look4sat.presentation.mapScreen.MapScreen
import com.rtbishop.look4sat.presentation.passesScreen.PassesScreen
import com.rtbishop.look4sat.presentation.passesScreen.PassesViewModel
import com.rtbishop.look4sat.presentation.radarScreen.RadarScreen
import com.rtbishop.look4sat.presentation.settingsScreen.SettingsScreen
sealed class BottomNavItem(var title: String, var icon: Int, var screen_route: String) {
object Satellites : BottomNavItem("Satellites", R.drawable.ic_satellite, "satellites")
object Passes : BottomNavItem("Passes", R.drawable.ic_list, "passes")
object Radar : BottomNavItem("Radar", R.drawable.ic_radar, "radar")
object WorldMap : BottomNavItem("World Map", R.drawable.ic_world, "world_map")
object Settings : BottomNavItem("Settings", R.drawable.ic_settings, "settings")
}
@Composable
fun BottomNavBar(navController: NavController) {
val items = listOf(
BottomNavItem.Satellites,
BottomNavItem.Passes,
BottomNavItem.Radar,
BottomNavItem.WorldMap,
BottomNavItem.Settings,
BottomNavItem.About
BottomNavItem.Settings
)
NavigationBar(modifier = Modifier.height(48.dp)) {
val navBackStackEntry by navController.currentBackStackEntryAsState()
@@ -53,15 +62,18 @@ fun BottomNavBar(navController: NavController) {
@Composable
fun NavigationGraph(navController: NavHostController) {
val navToPasses = { navController.navigate(BottomNavItem.Passes.screen_route) }
val navToRadar = { navController.navigate(BottomNavItem.Radar.screen_route) }
val passesViewModel: PassesViewModel = hiltViewModel()
NavHost(navController, startDestination = BottomNavItem.Passes.screen_route) {
composable(BottomNavItem.Satellites.screen_route) {
EntriesScreen(navToPasses, passesViewModel = passesViewModel)
}
composable(BottomNavItem.Passes.screen_route) { PassesScreen(viewModel = passesViewModel) }
composable(BottomNavItem.Passes.screen_route) {
PassesScreen(navToRadar, viewModel = passesViewModel)
}
composable(BottomNavItem.Radar.screen_route) { RadarScreen() }
composable(BottomNavItem.WorldMap.screen_route) { MapScreen() }
composable(BottomNavItem.Settings.screen_route) {}
composable(BottomNavItem.About.screen_route) { AboutScreen() }
composable(BottomNavItem.Settings.screen_route) { SettingsScreen() }
}
}
@@ -27,7 +27,6 @@ import android.view.View
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import com.rtbishop.look4sat.presentation.bottomNav.MainScreenView
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@@ -1,11 +0,0 @@
package com.rtbishop.look4sat.presentation.bottomNav
import com.rtbishop.look4sat.R
sealed class BottomNavItem(var title: String, var icon: Int, var screen_route: String) {
object Satellites : BottomNavItem("Satellites", R.drawable.ic_satellite, "satellites")
object Passes : BottomNavItem("Passes", R.drawable.ic_list, "passes")
object WorldMap : BottomNavItem("World Map", R.drawable.ic_map, "world_map")
object Settings : BottomNavItem("Settings", R.drawable.ic_settings, "settings")
object About : BottomNavItem("About", R.drawable.ic_about, "about")
}
@@ -135,7 +135,7 @@ private fun SaveButton(saveSelection: () -> Unit, modifier: Modifier = Modifier)
containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary
), shape = MaterialTheme.shapes.medium, modifier = modifier.width(96.dp)
) { Icon(painter = painterResource(id = R.drawable.ic_done), contentDescription = null) }
) { Icon(painter = painterResource(id = R.drawable.ic_checkmark), contentDescription = null) }
}
@Composable
@@ -4,6 +4,7 @@ package com.rtbishop.look4sat.presentation.passesScreen
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
@@ -40,7 +41,7 @@ private val sdf = SimpleDateFormat("HH:mm:ss", Locale.ENGLISH)
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun PassesScreen(viewModel: PassesViewModel = hiltViewModel()) {
fun PassesScreen(navToRadar: () -> Unit, viewModel: PassesViewModel = hiltViewModel()) {
val state = viewModel.passes.observeAsState()
val timerText = viewModel.timerText.observeAsState()
val isRefreshing = state.value is DataState.Loading
@@ -92,7 +93,7 @@ fun PassesScreen(viewModel: PassesViewModel = hiltViewModel()) {
)
}
}
PassesCard(refreshState, isRefreshing, passes)
PassesCard(refreshState, isRefreshing, passes, navToRadar)
}
}
@@ -104,13 +105,15 @@ private fun PassPreview() {
)
val satellite = NearEarthSat(data)
val pass = SatPass(1L, 25.0, 10L, 75.0, 850, 45.0, satellite, 0.5f)
MainTheme { Pass(pass = pass) }
MainTheme { Pass(pass = pass, {}) }
}
@Composable
private fun Pass(pass: SatPass, modifier: Modifier = Modifier) {
private fun Pass(pass: SatPass, navToRadar: () -> Unit, modifier: Modifier = Modifier) {
Surface(color = MaterialTheme.colorScheme.background, modifier = modifier) {
Surface(modifier = Modifier.padding(bottom = 2.dp)) {
Surface(modifier = Modifier
.padding(bottom = 2.dp)
.clickable { navToRadar() }) {
Column(
verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = Modifier
@@ -196,13 +199,16 @@ private fun Pass(pass: SatPass, modifier: Modifier = Modifier) {
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun PassesCard(
refreshState: PullRefreshState, isRefreshing: Boolean, passes: List<SatPass>
refreshState: PullRefreshState,
isRefreshing: Boolean,
passes: List<SatPass>,
navToRadar: () -> Unit
) {
ElevatedCard(modifier = Modifier.fillMaxSize()) {
Box(Modifier.pullRefresh(refreshState)) {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(items = passes, key = { item -> item.catNum + item.aosTime }) { pass ->
Pass(pass, Modifier.animateItemPlacement())
Pass(pass, navToRadar, Modifier.animateItemPlacement())
}
}
PullRefreshIndicator(
@@ -0,0 +1,57 @@
package com.rtbishop.look4sat.presentation.radarScreen
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
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.hilt.navigation.compose.hiltViewModel
import com.rtbishop.look4sat.R
@Composable
fun RadarScreen(viewModel: RadarViewModel = hiltViewModel()) {
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)
)
}
}
ElevatedCard(modifier = Modifier.fillMaxSize().weight(1f)) {
}
ElevatedCard(modifier = Modifier.fillMaxSize().weight(1f)) {
}
}
}
@@ -22,7 +22,6 @@ import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.View
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
@@ -31,7 +30,6 @@ import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.asLiveData
import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentSettingsBinding
import com.rtbishop.look4sat.domain.model.DataState
@@ -81,8 +79,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
settingsScroll.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { _, _, y, _, newY ->
if (y > newY) settingsFab.hide() else settingsFab.show()
})
settingsAbout.aboutVersion.text =
String.format(getString(R.string.app_version), BuildConfig.VERSION_NAME)
settingsBtnGithub.clickWithDebounce {
gotoUrl("https://github.com/rt-bishop/Look4Sat/")
}
@@ -98,7 +94,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
setupRemoteCard()
setupBTCard()
setupOtherCard()
setupOutroCard()
viewModel.stationPosition.asLiveData().observe(viewLifecycleOwner) { stationPos ->
stationPos?.let { handleStationPosition(stationPos) }
}
@@ -225,13 +220,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
}
}
private fun setupOutroCard() {
binding.run {
settingsOutro.outroThanks.movementMethod = LinkMovementMethod.getInstance()
settingsOutro.outroLicense.movementMethod = LinkMovementMethod.getInstance()
}
}
private fun handleStationPosition(pos: DataState<GeoPos>) {
when (pos) {
is DataState.Success -> {
@@ -1,4 +1,4 @@
package com.rtbishop.look4sat.presentation.aboutScreen
package com.rtbishop.look4sat.presentation.settingsScreen
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
@@ -24,11 +24,11 @@ import com.rtbishop.look4sat.presentation.gotoUrl
private const val POLICY_URL = "https://sites.google.com/view/look4sat-privacy-policy/home"
private const val LICENSE_URL = "https://www.gnu.org/licenses/gpl-3.0.html"
private const val GITHUB_URL = "https://github.com/rt-bishop/Look4Sat/"
private const val SUPPORT_URL = "https://ko-fi.com/rt_bishop"
private const val DONATE_URL = "https://ko-fi.com/rt_bishop"
private const val FDROID_URL = "https://f-droid.org/en/packages/com.rtbishop.look4sat/"
@Composable
fun AboutScreen() {
fun SettingsScreen() {
LazyColumn(
modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)
) {
@@ -71,13 +71,18 @@ private fun CardAbout(version: String, modifier: Modifier = Modifier) {
horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.padding(4.dp)
) {
CardButton(
onClick = { gotoUrl(context, POLICY_URL) },
text = stringResource(id = R.string.btn_privacy),
onClick = { gotoUrl(context, GITHUB_URL) },
text = stringResource(id = R.string.btn_github),
modifier = Modifier.weight(1f)
)
CardButton(
onClick = { gotoUrl(context, LICENSE_URL) },
text = stringResource(id = R.string.btn_license),
onClick = { gotoUrl(context, DONATE_URL) },
text = stringResource(id = R.string.btn_donate),
modifier = Modifier.weight(1f)
)
CardButton(
onClick = { gotoUrl(context, FDROID_URL) },
text = stringResource(id = R.string.btn_fdroid),
modifier = Modifier.weight(1f)
)
}
@@ -114,18 +119,13 @@ private fun CardCredits(modifier: Modifier = Modifier) {
horizontalArrangement = Arrangement.SpaceEvenly, modifier = Modifier.padding(4.dp)
) {
CardButton(
onClick = { gotoUrl(context, GITHUB_URL) },
text = stringResource(id = R.string.btn_github),
onClick = { gotoUrl(context, LICENSE_URL) },
text = stringResource(id = R.string.btn_license),
modifier = Modifier.weight(1f)
)
CardButton(
onClick = { gotoUrl(context, SUPPORT_URL) },
text = stringResource(id = R.string.btn_support),
modifier = Modifier.weight(1f)
)
CardButton(
onClick = { gotoUrl(context, FDROID_URL) },
text = stringResource(id = R.string.btn_fdroid),
onClick = { gotoUrl(context, POLICY_URL) },
text = stringResource(id = R.string.btn_privacy),
modifier = Modifier.weight(1f)
)
}