From 5aa837e5efe88b47d388394c28ad07b2f98db458 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Tue, 25 Jun 2024 18:29:18 +0100 Subject: [PATCH] Updated dependencies and gradle plugin, minor fixes --- app/src/main/AndroidManifest.xml | 12 +- .../com/rtbishop/look4sat/MainActivity.kt | 20 +- .../com/rtbishop/look4sat/MainApplication.kt | 13 - .../look4sat/presentation/MainScreen.kt | 2 +- .../look4sat/presentation/MainTheme.kt | 106 +++++++++ .../presentation/components/Common.kt | 67 ++++-- .../presentation/entries/EntriesDialog.kt | 4 +- .../presentation/entries/EntriesScreen.kt | 4 +- .../look4sat/presentation/info/InfoScreen.kt | 6 +- .../look4sat/presentation/map/MapScreen.kt | 37 +-- .../look4sat/presentation/map/MapViewModel.kt | 2 +- .../presentation/passes/PassesDialog.kt | 4 +- .../presentation/passes/PassesScreen.kt | 74 +++--- .../look4sat/presentation/radar/RadarView.kt | 99 +++++++- .../presentation/radar/RadarViewModel.kt | 2 +- .../presentation/settings/SettingsDialog.kt | 2 +- .../presentation/settings/SettingsScreen.kt | 26 +- .../settings/SettingsViewModel.kt | 2 +- .../look4sat/presentation/theme/Color.kt | 225 ------------------ .../look4sat/presentation/theme/Theme.kt | 217 ----------------- app/src/main/res/drawable/ic_calendar.xml | 9 + app/src/main/res/drawable/ic_direction.xml | 9 + app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-si/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values/strings.xml | 4 +- .../look4sat/data/repository/SettingsRepo.kt | 14 +- .../look4sat/domain/model/Settings.kt | 14 +- .../domain/repository/ISettingsRepo.kt | 2 +- gradle/libs.versions.toml | 28 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 31 files changed, 402 insertions(+), 610 deletions(-) create mode 100644 app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt delete mode 100644 app/src/main/java/com/rtbishop/look4sat/presentation/theme/Color.kt delete mode 100644 app/src/main/java/com/rtbishop/look4sat/presentation/theme/Theme.kt create mode 100644 app/src/main/res/drawable/ic_calendar.xml create mode 100644 app/src/main/res/drawable/ic_direction.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cd21467b..8f06ef47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,10 +1,9 @@ - + - + + android:theme="@style/Theme.Look4Sat.Main"> + android:theme="@style/Theme.Look4Sat.SplashScreen"> diff --git a/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt index 2cba4f5f..de5aa9e2 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt @@ -17,30 +17,24 @@ */ package com.rtbishop.look4sat -import android.content.Context -import android.content.res.Configuration import android.os.Bundle -import android.util.DisplayMetrics import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.platform.LocalContext import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.rtbishop.look4sat.presentation.MainScreen -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) - setContent { MainTheme { MainScreen() } } - } - - override fun attachBaseContext(newBase: Context?) { - val newConfig = Configuration(newBase?.resources?.configuration).apply { - densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE - fontScale = 1.0f + setContent { + val container = (LocalContext.current.applicationContext as MainApplication).container + val otherSettings = container.settingsRepo.otherSettings.collectAsState().value + MainTheme(isLightTheme = otherSettings.stateOfLightTheme) { MainScreen() } } - applyOverrideConfiguration(newConfig) - super.attachBaseContext(newBase) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt b/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt index 9b37cb76..e67b9c02 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt @@ -18,10 +18,6 @@ package com.rtbishop.look4sat import android.app.Application -import android.content.pm.ApplicationInfo -import android.os.StrictMode -import android.os.StrictMode.ThreadPolicy -import android.os.StrictMode.VmPolicy import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -32,7 +28,6 @@ class MainApplication : Application() { lateinit var container: MainContainer override fun onCreate() { - enableStrictMode() super.onCreate() container = MainContainer(this) // trigger automatic update every 48 hours @@ -53,14 +48,6 @@ class MainApplication : Application() { } } - private fun enableStrictMode() { - val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE - if (isDebuggable) { - StrictMode.setThreadPolicy(ThreadPolicy.Builder().detectAll().penaltyLog().build()) - StrictMode.setVmPolicy(VmPolicy.Builder().detectAll().penaltyLog().build()) - } - } - companion object { private const val AUTO_UPDATE_DELTA_MS = 172_800_000L // 48 hours in ms const val MAX_OKHTTP_CACHE_SIZE = 10_000_000L // 10 Megabytes diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt index c95f9310..a09e9f44 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt @@ -49,7 +49,7 @@ fun MainScreen(navController: NavHostController = rememberNavController()) { @Composable private fun MainNavBar(navController: NavController) { val items = listOf(Screen.Entries, Screen.Passes, Screen.Map, Screen.Settings, Screen.Info) - NavigationBar(modifier = Modifier.height(48.dp)) { + NavigationBar(modifier = Modifier.height(48.dp), tonalElevation = 0.dp) { val navBackStackEntry = navController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry.value?.destination?.route items.forEach { screen -> diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt new file mode 100644 index 00000000..b874fc34 --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainTheme.kt @@ -0,0 +1,106 @@ +package com.rtbishop.look4sat.presentation + +import androidx.activity.ComponentActivity +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.view.WindowCompat + +@Composable +fun MainTheme(isLightTheme: Boolean = false, content: @Composable () -> Unit) { + val view = LocalView.current + if (view.isInEditMode) { + MaterialTheme(darkScheme, shapes, typography, content) + } else { + val colorScheme = if (isLightTheme) lightScheme else darkScheme + SideEffect { + val window = (view.context as ComponentActivity).window + window.statusBarColor = colorScheme.background.toArgb() + window.navigationBarColor = colorScheme.surface.toArgb() + val insetsController = WindowCompat.getInsetsController(window, view) + insetsController.isAppearanceLightStatusBars = isLightTheme + } + MaterialTheme(colorScheme, shapes, typography, content) + } +} + +private val lightScheme = lightColorScheme( + primary = Color(0xFF715C0C), + onPrimary = Color(0xFFFFFFFF), + secondary = Color(0xFF685E40), + onSecondary = Color(0xFFFFFFFF), + secondaryContainer = Color(0xFFF1E1BB), + onSecondaryContainer = Color(0xFF221B04), + background = Color(0xFFFFF8F0), + onBackground = Color(0xFF1E1B13), + surface = Color(0xFFFFF8F0), + onSurface = Color(0xFF1E1B13), + surfaceTint = Color(0x00000000), + surfaceVariant = Color(0xFFEBE2CF), + onSurfaceVariant = Color(0xFF4C4639), + error = Color(0xFFDC0000), + outline = Color(0xFF7D7667), + scrim = Color(0xFF000000) +) + +private val darkScheme = darkColorScheme( + primary = Color(0xFFFFE082), + onPrimary = Color(0xFF000000), + secondary = Color(0xFFE0E0E0), + onSecondary = Color(0xFF000000), + secondaryContainer = Color(0xFFFFE082), // navBar indicator + onSecondaryContainer = Color(0xFF000000), // navBar active icon + background = Color(0xFF121212), + onBackground = Color(0xFFE0E0E0), + surface = Color(0xFF242424), + onSurface = Color(0xFFE0E0E0), + surfaceTint = Color(0x00000000), + surfaceVariant = Color(0xFF484848), // buttons background + onSurfaceVariant = Color(0xFFE0E0E0), // navBar inactive icon + error = Color(0xFFDC0000), + outline = Color(0xA3E0E0E0), + scrim = Color(0xFF000000) +) + +private val shapes = Shapes( + extraSmall = RoundedCornerShape(4.dp), // menus, snackbars, text fields + small = RoundedCornerShape(6.dp), // buttons, chips + medium = RoundedCornerShape(8.dp), // cards, small FABs + large = RoundedCornerShape(12.dp), // extended FABs, FABs, nav drawers + extraLarge = RoundedCornerShape(16.dp) // large FABs +) + +private val typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ), titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) +) 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 99cab85d..53e25a51 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 @@ -11,11 +11,13 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer 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 import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CardDefaults import androidx.compose.material3.CircularProgressIndicator @@ -41,7 +43,7 @@ import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.predict.NearEarthObject import com.rtbishop.look4sat.domain.predict.OrbitalData import com.rtbishop.look4sat.domain.predict.OrbitalPass -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -126,9 +128,9 @@ fun NextPassRow(pass: OrbitalPass) { tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(16.dp) ) + Spacer(modifier = Modifier.width(4.dp)) Text( - text = " ${pass.maxElevation}°", - textAlign = TextAlign.End, + text = "${pass.maxElevation}°", color = MaterialTheme.colorScheme.primary ) } @@ -137,21 +139,26 @@ fun NextPassRow(pass: OrbitalPass) { horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth() ) { - Text( - text = sdfTime.format(Date(pass.aosTime)), - textAlign = TextAlign.Start, - fontSize = 15.sp, - modifier = Modifier.weight(1f) - ) - Text( - text = stringResource(id = R.string.pass_aosLos, pass.aosAzimuth.toInt(), pass.losAzimuth.toInt()), - textAlign = TextAlign.Center, - fontSize = 15.sp, - modifier = Modifier.weight(1.5f) - ) Row( modifier = Modifier.weight(1f), - horizontalArrangement = Arrangement.End, + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_time), + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = sdfTime.format(Date(pass.aosTime)), + fontSize = 15.sp, + modifier = Modifier.weight(1f) + ) + } + Row( + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Icon( @@ -159,9 +166,29 @@ fun NextPassRow(pass: OrbitalPass) { contentDescription = null, modifier = Modifier.size(16.dp) ) + Spacer(modifier = Modifier.width(4.dp)) Text( - text = " ${pass.altitude} km", - textAlign = TextAlign.Start, + text = "${pass.altitude} km", + fontSize = 15.sp + ) + } + Row( + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_direction), + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = stringResource( + id = R.string.pass_aosLos, + pass.aosAzimuth.toInt(), + pass.losAzimuth.toInt() + ), fontSize = 15.sp ) } @@ -174,8 +201,8 @@ fun NextPassRow(pass: OrbitalPass) { fun CardButton(onClick: () -> Unit, text: String, modifier: Modifier = Modifier) { ElevatedButton( onClick = { onClick() }, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.tertiary, - contentColor = MaterialTheme.colorScheme.onTertiary + containerColor = MaterialTheme.colorScheme.surfaceVariant, + contentColor = MaterialTheme.colorScheme.onSurfaceVariant ), shape = MaterialTheme.shapes.small, modifier = modifier ) { Text(text = text, fontSize = 17.sp) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesDialog.kt index bcfe82a3..530f3c33 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesDialog.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme @Preview(showBackground = true) @Composable @@ -56,7 +56,7 @@ fun TypesDialog(items: List, selected: String, dismiss: () -> Unit, sele text = "$index).", modifier = Modifier.padding(start = 12.dp, end = 6.dp), fontWeight = FontWeight.Normal, - color = MaterialTheme.colorScheme.secondary + color = MaterialTheme.colorScheme.primary ) Text( text = item, diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt index f019da8c..8436620b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt @@ -39,7 +39,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.model.SatItem -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardIcon import com.rtbishop.look4sat.presentation.components.CardLoadingIndicator @@ -199,7 +199,7 @@ private fun Entry(item: SatItem, onSelected: (Int, Boolean) -> Unit, modifier: M ) { Text( text = "$passSatId - ", - color = MaterialTheme.colorScheme.secondary + color = MaterialTheme.colorScheme.primary ) Text( text = item.name, diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/info/InfoScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/info/InfoScreen.kt index c5376bb3..23c64830 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/info/InfoScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/info/InfoScreen.kt @@ -22,7 +22,7 @@ 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.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardButton import com.rtbishop.look4sat.presentation.components.gotoUrl @@ -52,7 +52,7 @@ private fun CardCredits(modifier: Modifier = Modifier) { text = stringResource(id = R.string.outro_title), fontSize = 18.sp, fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.secondary, + color = MaterialTheme.colorScheme.primary, modifier = modifier.padding(6.dp) ) Text( @@ -64,7 +64,7 @@ private fun CardCredits(modifier: Modifier = Modifier) { text = stringResource(id = R.string.outro_license), fontSize = 18.sp, fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.secondary, + color = MaterialTheme.colorScheme.primary, modifier = modifier.padding(6.dp) ) Row(horizontalArrangement = Arrangement.SpaceEvenly) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt index 5fd0c88f..e5c5e63d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt @@ -9,7 +9,6 @@ import android.graphics.Paint import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -32,7 +31,6 @@ import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.OrbitalObject import com.rtbishop.look4sat.domain.predict.OrbitalPos -import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.util.GeoPoint import org.osmdroid.views.CustomZoomButtonsController import org.osmdroid.views.MapView @@ -73,7 +71,7 @@ fun MapScreen() { val positionClick = { orbitalObject: OrbitalObject -> viewModel.selectSatellite(orbitalObject) } Column(modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) { ElevatedCard(modifier = Modifier.fillMaxSize()) { - MapView(modifier = Modifier.fillMaxSize()) { mapView -> + MapView(modifier = Modifier.fillMaxSize(), isLightTheme = viewModel.stateOfLightTheme) { mapView -> stationPos.value?.let { setStationPosition(it, mapView) } positions.value?.let { setPositions(it, mapView, positionClick) } satTrack.value?.let { setSatelliteTrack(it, mapView) } @@ -98,7 +96,11 @@ private fun setStationPosition(stationPos: GeoPos, mapView: MapView) { } } -private fun setPositions(posMap: Map, mapView: MapView, action: (OrbitalObject) -> Unit) { +private fun setPositions( + posMap: Map, + mapView: MapView, + action: (OrbitalObject) -> Unit +) { val markers = FolderOverlay() try { posMap.entries.forEach { @@ -195,24 +197,27 @@ private fun setFootprint(orbitalPos: OrbitalPos, mapView: MapView) { //} @Composable -private fun MapView(modifier: Modifier = Modifier, update: ((map: MapView) -> Unit)? = null) { - val mapView = rememberMapViewWithLifecycle() +private fun MapView( + modifier: Modifier = Modifier, + isLightTheme: Boolean, + update: ((map: MapView) -> Unit)? = null +) { + val mapView = rememberMapViewWithLifecycle(isLightTheme) AndroidView({ mapView }, modifier) { update?.invoke(it) } } @Composable -private fun rememberMapViewWithLifecycle(): MapView { +private fun rememberMapViewWithLifecycle(isLightTheme: Boolean): MapView { val context = LocalContext.current val mapView = remember { MapView(context) }.apply { setMultiTouchControls(true) - setTileSource(TileSourceFactory.WIKIMEDIA) minZoomLevel = getMinZoom(resources.displayMetrics.heightPixels) + 0.25 maxZoomLevel = 5.99 controller.setZoom(minZoomLevel + 0.5) zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER) overlayManager.tilesOverlay.loadingBackgroundColor = Color.TRANSPARENT overlayManager.tilesOverlay.loadingLineColor = Color.TRANSPARENT - overlayManager.tilesOverlay.setColorFilter(getColorFilter()) + overlayManager.tilesOverlay.setColorFilter(getColorFilter(isLightTheme)) setScrollableAreaLimitLatitude(maxLat, minLat, 0) // add overlays: 0 - GSP, 1 - SatTrack, 2 - SatFootprint, 3 - SatIcons overlays.addAll(Array(4) { FolderOverlay() }) @@ -239,17 +244,13 @@ private fun rememberMapViewLifecycleObserver(mapView: MapView) = remember(mapVie } @Composable -private fun getColorFilter(): ColorMatrixColorFilter { - val viewModel = viewModel(MapViewModel::class.java, factory = MapViewModel.Factory) - val grayScaleMatrix = ColorMatrix().apply { setSaturation(0f) } - val negativeMatrix = ColorMatrix( +private fun getColorFilter(isLightTheme: Boolean): ColorMatrixColorFilter { + val grayScale = ColorMatrix().apply { setSaturation(0f) } + val negative = ColorMatrix( floatArrayOf(-1f, 0f, 0f, 0f, 260f, 0f, -1f, 0f, 0f, 260f, 0f, 0f, -1f, 0f, 260f, 0f, 0f, 0f, 1f, 0f) ) - negativeMatrix.preConcat(grayScaleMatrix) - return when { - isSystemInDarkTheme() || viewModel.stateOfOldScheme -> ColorMatrixColorFilter(negativeMatrix) - else -> ColorMatrixColorFilter(grayScaleMatrix) - } + negative.preConcat(grayScale) + return if (isLightTheme) ColorMatrixColorFilter(grayScale) else ColorMatrixColorFilter(negative) } private fun getMinZoom(screenHeight: Int): Double { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt index 5fa4ba6c..21ae39a5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt @@ -53,7 +53,7 @@ class MapViewModel(private val satelliteRepo: ISatelliteRepo, settingsRepo: ISet private var dataUpdateRate = 1000L private var selectedOrbitalObject: OrbitalObject? = null - val stateOfOldScheme = settingsRepo.otherSettings.value.stateOfOldScheme + val stateOfLightTheme = settingsRepo.otherSettings.value.stateOfLightTheme val stationPosition = flow { val osmLat = clipLat(stationPos.latitude) 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 d18af581..cc9bbee7 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 @@ -56,7 +56,7 @@ 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.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardButton private val allModes = listOf( @@ -206,7 +206,7 @@ fun RadiosDialog(modes: List, dismiss: () -> Unit, save: (List) text = "$index).", modifier = Modifier.padding(start = 8.dp, end = 6.dp), fontWeight = FontWeight.Normal, - color = MaterialTheme.colorScheme.secondary + color = MaterialTheme.colorScheme.primary ) Text( text = item, 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 02e0ea2f..f358f6d3 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 @@ -7,10 +7,12 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ElevatedCard @@ -35,7 +37,7 @@ import com.rtbishop.look4sat.domain.predict.DeepSpaceObject import com.rtbishop.look4sat.domain.predict.NearEarthObject import com.rtbishop.look4sat.domain.predict.OrbitalData import com.rtbishop.look4sat.domain.predict.OrbitalPass -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardIcon import com.rtbishop.look4sat.presentation.components.NextPassRow import com.rtbishop.look4sat.presentation.components.PullRefreshIndicator @@ -48,7 +50,7 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -private val sdfDate = SimpleDateFormat("EEE, dd MMM", Locale.ENGLISH) +private val sdfDate = SimpleDateFormat("EEE dd MMM", Locale.ENGLISH) private val sdfTime = SimpleDateFormat("HH:mm:ss", Locale.ENGLISH) @Composable @@ -155,9 +157,9 @@ private fun PassItem(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifie tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(16.dp) ) + Spacer(modifier = Modifier.width(4.dp)) Text( - text = " ${pass.maxElevation}°", - textAlign = TextAlign.End, + text = "${pass.maxElevation}°", color = MaterialTheme.colorScheme.primary ) } @@ -166,25 +168,25 @@ private fun PassItem(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifie horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth() ) { - Text( - text = sdfDate.format(Date(pass.aosTime)), - textAlign = TextAlign.Start, - fontSize = 15.sp, - modifier = Modifier.weight(1f) - ) - Text( - text = stringResource( - id = R.string.pass_aosLos, - pass.aosAzimuth.toInt(), - pass.losAzimuth.toInt() - ), - textAlign = TextAlign.Center, - fontSize = 15.sp, - modifier = Modifier.weight(1.5f) - ) Row( modifier = Modifier.weight(1f), - horizontalArrangement = Arrangement.End, + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_calendar), + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = sdfDate.format(Date(pass.aosTime)), + fontSize = 15.sp + ) + } + Row( + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Icon( @@ -192,9 +194,29 @@ private fun PassItem(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifie contentDescription = null, modifier = Modifier.size(16.dp) ) + Spacer(modifier = Modifier.width(4.dp)) Text( - text = " ${pass.altitude} km", - textAlign = TextAlign.Start, + text = "${pass.altitude} km", + fontSize = 15.sp + ) + } + Row( + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(id = R.drawable.ic_direction), + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = stringResource( + id = R.string.pass_aosLos, + pass.aosAzimuth.toInt(), + pass.losAzimuth.toInt() + ), fontSize = 15.sp ) } @@ -211,11 +233,7 @@ private fun PassItem(pass: OrbitalPass, navToRadar: (Int, Long) -> Unit, modifie ) LinearProgressIndicator( progress = { if (pass.isDeepSpace) 100f else pass.progress }, - modifier = modifier - .fillMaxWidth(0.75f) - .padding(top = 2.dp), - color = MaterialTheme.colorScheme.primary, - trackColor = MaterialTheme.colorScheme.secondaryContainer + modifier = modifier.fillMaxWidth(0.75f) ) Text( text = if (pass.isDeepSpace) defaultTime else sdfTime.format(Date(pass.losTime)), diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt index 5949483f..9eb578fe 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radar/RadarView.kt @@ -1,5 +1,7 @@ package com.rtbishop.look4sat.presentation.radar +import android.media.AudioAttributes +import android.media.SoundPool import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition @@ -8,7 +10,10 @@ import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -25,33 +30,107 @@ import androidx.compose.ui.graphics.drawscope.Fill import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.rotate import androidx.compose.ui.graphics.drawscope.translate +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.text.TextMeasurer import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.unit.sp -import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.core.view.HapticFeedbackConstantsCompat +import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.predict.OrbitalPos import com.rtbishop.look4sat.domain.predict.PI_2 import com.rtbishop.look4sat.domain.utility.toRadians +import kotlin.math.abs import kotlin.math.cos +import kotlin.math.min +import kotlin.math.pow import kotlin.math.sin +import kotlin.math.sqrt @Composable fun RadarViewCompose(item: OrbitalPos, items: List, azimElev: Pair) { - val viewModel = viewModel(RadarViewModel::class.java, factory = RadarViewModel.Factory) - val radarColor: Color = if (viewModel.stateOfOldScheme) Color(0xFFDCDCDC) else MaterialTheme.colorScheme.tertiary - val primaryColor: Color = if (viewModel.stateOfOldScheme) Color(0xFFFFE082) else MaterialTheme.colorScheme.primary - val secondaryColor: Color = if (viewModel.stateOfOldScheme) Color(0xFFDC0000) else MaterialTheme.colorScheme.onSurface + val context = LocalContext.current + val view = LocalView.current + val radarColor = MaterialTheme.colorScheme.secondary + val trackColor = MaterialTheme.colorScheme.primary + val aimColor = MaterialTheme.colorScheme.error val strokeWidth = 4f val animTransition = rememberInfiniteTransition(label = "animScale") val animSpec = infiniteRepeatable(tween(1000)) val animScale = animTransition.animateFloat(16f, 64f, animSpec, label = "animScale") + val aimThreshold = 0.05f val measurer = rememberTextMeasurer() val sweepDegrees = remember { mutableFloatStateOf(0f) } val trackCreated = remember { mutableStateOf(false) } val trackPath = remember { mutableStateOf(Path()) } val trackEffect = remember { mutableStateOf(PathEffect.cornerPathEffect(0f)) } + val soundPool = remember { mutableStateOf(null) } + val beepSoundId = remember { mutableIntStateOf(0) } + val aimTargetDifference = remember { mutableFloatStateOf(0f) } + + LaunchedEffect(item.azimuth, item.elevation, azimElev.first, azimElev.second) { + val aimAzimuthRadians = azimElev.first.toDouble().toRadians() + val aimElevationRadians = abs(min(azimElev.second, 0f)).toDouble().toRadians() + // radius of 0.5 makes the aimTargetDifference range 0.0 to 1.0 + val radius = 0.5 + val aimX = sph2CartX(aimAzimuthRadians, aimElevationRadians, radius) + val aimY = sph2CartY(aimAzimuthRadians, aimElevationRadians, radius) + val satX = sph2CartX(item.azimuth, item.elevation, radius) + val satY = sph2CartY(item.azimuth, item.elevation, radius) + aimTargetDifference.floatValue = sqrt((satX - aimX).pow(2) + (satY - aimY).pow(2)) + + + val minPlaybackRate = 0.5f + val maxPlaybackRate = 2.0f + val playbackRate = + maxPlaybackRate - (aimTargetDifference.floatValue / (maxPlaybackRate - minPlaybackRate)) + + soundPool.value?.setRate(beepSoundId.intValue, playbackRate) + } + + LaunchedEffect(aimTargetDifference.floatValue < aimThreshold) { + if (aimTargetDifference.floatValue < aimThreshold) { + view.performHapticFeedback(HapticFeedbackConstantsCompat.VIRTUAL_KEY) + soundPool.value?.pause(beepSoundId.intValue) + } else { + soundPool.value?.resume(beepSoundId.intValue) + } + } + + LaunchedEffect(item.elevation > 0) { + if(item.elevation > 0) { + soundPool.value?.resume(beepSoundId.intValue) + } else { + soundPool.value?.pause(beepSoundId.intValue) + } + } + + DisposableEffect(Unit) { + val audioAttributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build() + + soundPool.value = SoundPool.Builder() + .setMaxStreams(1) + .setAudioAttributes(audioAttributes) + .build() + + beepSoundId.intValue = soundPool.value?.load(context, R.raw.beep, 1) ?: 0 + + soundPool.value?.setOnLoadCompleteListener { soundPool, _, status -> + if (status == 0) { + soundPool.play(beepSoundId.intValue, 0.5f, 0.5f, 0, -1, 1f) + } + } + + onDispose { + soundPool.value?.release() + } + } + Canvas(modifier = Modifier.fillMaxSize()) { val radius = (size.minDimension / 2f) * 0.95f if (!trackCreated.value) { @@ -60,13 +139,13 @@ fun RadarViewCompose(item: OrbitalPos, items: List, azimElev: Pair 0) drawPosition(item, radius, animScale.value, primaryColor) - drawAim(azimElev.first, azimElev.second, radius, strokeWidth, secondaryColor) + drawTrack(trackPath.value, trackEffect.value, aimColor, trackColor) + if (item.elevation > 0) drawPosition(item, radius, animScale.value, trackColor) + drawAim(azimElev.first, azimElev.second, radius, strokeWidth, aimColor) } sweepDegrees.floatValue = (sweepDegrees.floatValue + 360 / 12.0f / 60) % 360 } 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 31f55fe9..4f4b584f 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 @@ -56,7 +56,7 @@ class RadarViewModel( private val stationPos = settingsRepo.stationPosition.value private val magDeclination = getMagDeclination(stationPos) - val stateOfOldScheme = settingsRepo.otherSettings.value.stateOfOldScheme + val stateOfLightTheme = settingsRepo.otherSettings.value.stateOfLightTheme val transmitters = mutableStateOf>(emptyList()) val radarData = mutableStateOf(null) val orientation = mutableStateOf(sensorsRepo.orientation.value) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsDialog.kt index 87678a66..c1064f9e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsDialog.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardButton @Preview(showBackground = true) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt index e12092a6..689f9389 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsScreen.kt @@ -36,7 +36,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.rtbishop.look4sat.R import com.rtbishop.look4sat.domain.model.OtherSettings import com.rtbishop.look4sat.domain.predict.GeoPos -import com.rtbishop.look4sat.presentation.theme.MainTheme +import com.rtbishop.look4sat.presentation.MainTheme import com.rtbishop.look4sat.presentation.components.CardButton import com.rtbishop.look4sat.presentation.components.gotoUrl import com.rtbishop.look4sat.presentation.components.showToast @@ -110,7 +110,7 @@ fun SettingsScreen() { val toggleUpdate = { value: Boolean -> viewModel.toggleUpdate(value) } val toggleSweep = { value: Boolean -> viewModel.toggleSweep(value) } val toggleSensor = { value: Boolean -> viewModel.toggleSensor(value) } - val toggleOldScheme = { value: Boolean -> viewModel.toggleOldScheme(value)} + val toggleLightTheme = { value: Boolean -> viewModel.toggleLightTheme(value)} // Screen setup val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "4.0.0" @@ -118,7 +118,7 @@ fun SettingsScreen() { item { CardAbout(versionName) } item { LocationCard(positionSettings, setGpsPos, showPosDialog, showLocDialog, dismissPos) } item { DataCard(dataSettings, updateFromWeb, updateFromFile, clearAllData) } - item { OtherCard(otherSettings, toggleUtc, toggleUpdate, toggleSweep, toggleSensor,toggleOldScheme) } + item { OtherCard(otherSettings, toggleUtc, toggleUpdate, toggleSweep, toggleSensor,toggleLightTheme) } } } @@ -140,7 +140,7 @@ private fun CardAbout(version: String, modifier: Modifier = Modifier) { ) { Icon( painter = painterResource(id = R.drawable.ic_sputnik), - tint = MaterialTheme.colorScheme.secondary, + tint = MaterialTheme.colorScheme.primary, contentDescription = null, modifier = Modifier.size(72.dp) ) @@ -148,7 +148,7 @@ private fun CardAbout(version: String, modifier: Modifier = Modifier) { Text( text = stringResource(id = R.string.app_name), fontSize = 48.sp, - color = MaterialTheme.colorScheme.secondary + color = MaterialTheme.colorScheme.primary ) Text( text = stringResource(id = R.string.app_version, version), fontSize = 20.sp @@ -374,7 +374,7 @@ private fun OtherCardPreview() = MainTheme { stateOfSensors = true, stateOfSweep = true, stateOfUtc = false, - stateOfOldScheme = false) + stateOfLightTheme = false) OtherCard(settings = values, {}, {}, {}, {},{}) } @@ -385,7 +385,7 @@ private fun OtherCard( toggleUpdate: (Boolean) -> Unit, toggleSweep: (Boolean) -> Unit, toggleSensor: (Boolean) -> Unit, - toggleOldScheme: (Boolean) -> Unit + toggleLightTheme: (Boolean) -> Unit ) { ElevatedCard(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 2.dp)) { @@ -426,8 +426,8 @@ private fun OtherCard( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - Text(text = stringResource(id = R.string.other_switch_old_scheme)) - Switch(checked = settings.stateOfOldScheme, onCheckedChange = { toggleOldScheme(it) }) + Text(text = stringResource(id = R.string.other_switch_light_theme)) + Switch(checked = settings.stateOfLightTheme, onCheckedChange = { toggleLightTheme(it) }) } } } @@ -448,14 +448,14 @@ private fun setUpdateTime(updateTime: Long): String { private fun UpdateIndicator(isUpdating: Boolean, modifier: Modifier = Modifier) = if (isUpdating) { LinearProgressIndicator( modifier = modifier.padding(start = 6.dp), - color = MaterialTheme.colorScheme.primary, - trackColor = MaterialTheme.colorScheme.secondaryContainer +// color = MaterialTheme.colorScheme.primary, +// trackColor = MaterialTheme.colorScheme.secondaryContainer ) } else { LinearProgressIndicator( progress = { 0f }, modifier = modifier.padding(start = 6.dp), - color = MaterialTheme.colorScheme.primary, - trackColor = MaterialTheme.colorScheme.secondaryContainer +// color = MaterialTheme.colorScheme.primary, +// trackColor = MaterialTheme.colorScheme.secondaryContainer ) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt index 0607e77e..1d03ee6d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settings/SettingsViewModel.kt @@ -129,7 +129,7 @@ class SettingsViewModel( fun toggleUpdate(value: Boolean) = settingsRepo.setStateOfAutoUpdate(value) fun toggleSweep(value: Boolean) = settingsRepo.setStateOfSweep(value) fun toggleSensor(value: Boolean) = settingsRepo.setStateOfSensors(value) - fun toggleOldScheme(value: Boolean) = settingsRepo.setStateOfOldScheme(value) + fun toggleLightTheme(value: Boolean) = settingsRepo.setStateOfLightTheme(value) // fun getRotatorEnabled(): Boolean = settings.getRotatorEnabled() // fun setRotatorEnabled(value: Boolean) = settings.setRotatorEnabled(value) // fun getRotatorServer(): String = settings.getRotatorServer() diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Color.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Color.kt deleted file mode 100644 index 0965f05a..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Color.kt +++ /dev/null @@ -1,225 +0,0 @@ -package com.rtbishop.look4sat.presentation.theme -import androidx.compose.ui.graphics.Color - -val primaryLight = Color(0xFF715C0C) -val onPrimaryLight = Color(0xFFFFFFFF) -val primaryContainerLight = Color(0xFFFEE086) -val onPrimaryContainerLight = Color(0xFF231B00) -val secondaryLight = Color(0xFF685E40) -val onSecondaryLight = Color(0xFFFFFFFF) -val secondaryContainerLight = Color(0xFFF1E1BB) -val onSecondaryContainerLight = Color(0xFF221B04) -val tertiaryLight = Color(0xFF46664B) -val onTertiaryLight = Color(0xFFFFFFFF) -val tertiaryContainerLight = Color(0xFFC7ECCA) -val onTertiaryContainerLight = Color(0xFF02210C) -val errorLight = Color(0xFFBA1A1A) -val onErrorLight = Color(0xFFFFFFFF) -val errorContainerLight = Color(0xFFFFDAD6) -val onErrorContainerLight = Color(0xFF410002) -val backgroundLight = Color(0xFFFFF8F0) -val onBackgroundLight = Color(0xFF1E1B13) -val surfaceLight = Color(0xFFFFF8F0) -val onSurfaceLight = Color(0xFF1E1B13) -val surfaceVariantLight = Color(0xFFEBE2CF) -val onSurfaceVariantLight = Color(0xFF4C4639) -val outlineLight = Color(0xFF7D7667) -val outlineVariantLight = Color(0xFFCEC6B4) -val scrimLight = Color(0xFF000000) -val inverseSurfaceLight = Color(0xFF343027) -val inverseOnSurfaceLight = Color(0xFFF8F0E2) -val inversePrimaryLight = Color(0xFFE1C46D) -val surfaceDimLight = Color(0xFFE1D9CC) -val surfaceBrightLight = Color(0xFFFFF8F0) -val surfaceContainerLowestLight = Color(0xFFFFFFFF) -val surfaceContainerLowLight = Color(0xFFFBF3E5) -val surfaceContainerLight = Color(0xFFF5EDDF) -val surfaceContainerHighLight = Color(0xFFEFE7DA) -val surfaceContainerHighestLight = Color(0xFFE9E2D4) - -val primaryLightMediumContrast = Color(0xFF524100) -val onPrimaryLightMediumContrast = Color(0xFFFFFFFF) -val primaryContainerLightMediumContrast = Color(0xFF897224) -val onPrimaryContainerLightMediumContrast = Color(0xFFFFFFFF) -val secondaryLightMediumContrast = Color(0xFF4B4226) -val onSecondaryLightMediumContrast = Color(0xFFFFFFFF) -val secondaryContainerLightMediumContrast = Color(0xFF7F7454) -val onSecondaryContainerLightMediumContrast = Color(0xFFFFFFFF) -val tertiaryLightMediumContrast = Color(0xFF2B4A31) -val onTertiaryLightMediumContrast = Color(0xFFFFFFFF) -val tertiaryContainerLightMediumContrast = Color(0xFF5C7C60) -val onTertiaryContainerLightMediumContrast = Color(0xFFFFFFFF) -val errorLightMediumContrast = Color(0xFF8C0009) -val onErrorLightMediumContrast = Color(0xFFFFFFFF) -val errorContainerLightMediumContrast = Color(0xFFDA342E) -val onErrorContainerLightMediumContrast = Color(0xFFFFFFFF) -val backgroundLightMediumContrast = Color(0xFFFFF8F0) -val onBackgroundLightMediumContrast = Color(0xFF1E1B13) -val surfaceLightMediumContrast = Color(0xFFFFF8F0) -val onSurfaceLightMediumContrast = Color(0xFF1E1B13) -val surfaceVariantLightMediumContrast = Color(0xFFEBE2CF) -val onSurfaceVariantLightMediumContrast = Color(0xFF484235) -val outlineLightMediumContrast = Color(0xFF655F50) -val outlineVariantLightMediumContrast = Color(0xFF817A6B) -val scrimLightMediumContrast = Color(0xFF000000) -val inverseSurfaceLightMediumContrast = Color(0xFF343027) -val inverseOnSurfaceLightMediumContrast = Color(0xFFF8F0E2) -val inversePrimaryLightMediumContrast = Color(0xFFE1C46D) -val surfaceDimLightMediumContrast = Color(0xFFE1D9CC) -val surfaceBrightLightMediumContrast = Color(0xFFFFF8F0) -val surfaceContainerLowestLightMediumContrast = Color(0xFFFFFFFF) -val surfaceContainerLowLightMediumContrast = Color(0xFFFBF3E5) -val surfaceContainerLightMediumContrast = Color(0xFFF5EDDF) -val surfaceContainerHighLightMediumContrast = Color(0xFFEFE7DA) -val surfaceContainerHighestLightMediumContrast = Color(0xFFE9E2D4) - -val primaryLightHighContrast = Color(0xFF2B2100) -val onPrimaryLightHighContrast = Color(0xFFFFFFFF) -val primaryContainerLightHighContrast = Color(0xFF524100) -val onPrimaryContainerLightHighContrast = Color(0xFFFFFFFF) -val secondaryLightHighContrast = Color(0xFF292209) -val onSecondaryLightHighContrast = Color(0xFFFFFFFF) -val secondaryContainerLightHighContrast = Color(0xFF4B4226) -val onSecondaryContainerLightHighContrast = Color(0xFFFFFFFF) -val tertiaryLightHighContrast = Color(0xFF082813) -val onTertiaryLightHighContrast = Color(0xFFFFFFFF) -val tertiaryContainerLightHighContrast = Color(0xFF2B4A31) -val onTertiaryContainerLightHighContrast = Color(0xFFFFFFFF) -val errorLightHighContrast = Color(0xFF4E0002) -val onErrorLightHighContrast = Color(0xFFFFFFFF) -val errorContainerLightHighContrast = Color(0xFF8C0009) -val onErrorContainerLightHighContrast = Color(0xFFFFFFFF) -val backgroundLightHighContrast = Color(0xFFFFF8F0) -val onBackgroundLightHighContrast = Color(0xFF1E1B13) -val surfaceLightHighContrast = Color(0xFFFFF8F0) -val onSurfaceLightHighContrast = Color(0xFF000000) -val surfaceVariantLightHighContrast = Color(0xFFEBE2CF) -val onSurfaceVariantLightHighContrast = Color(0xFF282418) -val outlineLightHighContrast = Color(0xFF484235) -val outlineVariantLightHighContrast = Color(0xFF484235) -val scrimLightHighContrast = Color(0xFF000000) -val inverseSurfaceLightHighContrast = Color(0xFF343027) -val inverseOnSurfaceLightHighContrast = Color(0xFFFFFFFF) -val inversePrimaryLightHighContrast = Color(0xFFFFEBB4) -val surfaceDimLightHighContrast = Color(0xFFE1D9CC) -val surfaceBrightLightHighContrast = Color(0xFFFFF8F0) -val surfaceContainerLowestLightHighContrast = Color(0xFFFFFFFF) -val surfaceContainerLowLightHighContrast = Color(0xFFFBF3E5) -val surfaceContainerLightHighContrast = Color(0xFFF5EDDF) -val surfaceContainerHighLightHighContrast = Color(0xFFEFE7DA) -val surfaceContainerHighestLightHighContrast = Color(0xFFE9E2D4) - -val primaryDark = Color(0xFFE1C46D) -val onPrimaryDark = Color(0xFF3C2F00) -val primaryContainerDark = Color(0xFF564500) -val onPrimaryContainerDark = Color(0xFFFEE086) -val secondaryDark = Color(0xFFD4C5A1) -val onSecondaryDark = Color(0xFF383016) -val secondaryContainerDark = Color(0xFF50462A) -val onSecondaryContainerDark = Color(0xFFF1E1BB) -val tertiaryDark = Color(0xFFACCFAF) -val onTertiaryDark = Color(0xFF183720) -val tertiaryContainerDark = Color(0xFF2E4E35) -val onTertiaryContainerDark = Color(0xFFC7ECCA) -val errorDark = Color(0xFFFFB4AB) -val onErrorDark = Color(0xFF690005) -val errorContainerDark = Color(0xFF93000A) -val onErrorContainerDark = Color(0xFFFFDAD6) -val backgroundDark = Color(0xFF16130B) -val onBackgroundDark = Color(0xFFE9E2D4) -val surfaceDark = Color(0xFF16130B) -val onSurfaceDark = Color(0xFFE9E2D4) -val surfaceVariantDark = Color(0xFF4C4639) -val onSurfaceVariantDark = Color(0xFFCEC6B4) -val outlineDark = Color(0xFF979080) -val outlineVariantDark = Color(0xFF4C4639) -val scrimDark = Color(0xFF000000) -val inverseSurfaceDark = Color(0xFFE9E2D4) -val inverseOnSurfaceDark = Color(0xFF343027) -val inversePrimaryDark = Color(0xFF715C0C) -val surfaceDimDark = Color(0xFF16130B) -val surfaceBrightDark = Color(0xFF3D392F) -val surfaceContainerLowestDark = Color(0xFF110E07) -val surfaceContainerLowDark = Color(0xFF1E1B13) -val surfaceContainerDark = Color(0xFF231F17) -val surfaceContainerHighDark = Color(0xFF2D2A21) -val surfaceContainerHighestDark = Color(0xFF38342B) - -val primaryDarkMediumContrast = Color(0xFFE5C971) -val onPrimaryDarkMediumContrast = Color(0xFF1D1500) -val primaryContainerDarkMediumContrast = Color(0xFFA88F3D) -val onPrimaryContainerDarkMediumContrast = Color(0xFF000000) -val secondaryDarkMediumContrast = Color(0xFFD8CAA5) -val onSecondaryDarkMediumContrast = Color(0xFF1C1601) -val secondaryContainerDarkMediumContrast = Color(0xFF9C906E) -val onSecondaryContainerDarkMediumContrast = Color(0xFF000000) -val tertiaryDarkMediumContrast = Color(0xFFB0D4B3) -val onTertiaryDarkMediumContrast = Color(0xFF001B08) -val tertiaryContainerDarkMediumContrast = Color(0xFF77997B) -val onTertiaryContainerDarkMediumContrast = Color(0xFF000000) -val errorDarkMediumContrast = Color(0xFFFFBAB1) -val onErrorDarkMediumContrast = Color(0xFF370001) -val errorContainerDarkMediumContrast = Color(0xFFFF5449) -val onErrorContainerDarkMediumContrast = Color(0xFF000000) -val backgroundDarkMediumContrast = Color(0xFF16130B) -val onBackgroundDarkMediumContrast = Color(0xFFE9E2D4) -val surfaceDarkMediumContrast = Color(0xFF16130B) -val onSurfaceDarkMediumContrast = Color(0xFFFFFAF6) -val surfaceVariantDarkMediumContrast = Color(0xFF4C4639) -val onSurfaceVariantDarkMediumContrast = Color(0xFFD3CAB8) -val outlineDarkMediumContrast = Color(0xFFAAA291) -val outlineVariantDarkMediumContrast = Color(0xFF898273) -val scrimDarkMediumContrast = Color(0xFF000000) -val inverseSurfaceDarkMediumContrast = Color(0xFFE9E2D4) -val inverseOnSurfaceDarkMediumContrast = Color(0xFF2D2A21) -val inversePrimaryDarkMediumContrast = Color(0xFF584600) -val surfaceDimDarkMediumContrast = Color(0xFF16130B) -val surfaceBrightDarkMediumContrast = Color(0xFF3D392F) -val surfaceContainerLowestDarkMediumContrast = Color(0xFF110E07) -val surfaceContainerLowDarkMediumContrast = Color(0xFF1E1B13) -val surfaceContainerDarkMediumContrast = Color(0xFF231F17) -val surfaceContainerHighDarkMediumContrast = Color(0xFF2D2A21) -val surfaceContainerHighestDarkMediumContrast = Color(0xFF38342B) - -val primaryDarkHighContrast = Color(0xFFFFFAF6) -val onPrimaryDarkHighContrast = Color(0xFF000000) -val primaryContainerDarkHighContrast = Color(0xFFE5C971) -val onPrimaryContainerDarkHighContrast = Color(0xFF000000) -val secondaryDarkHighContrast = Color(0xFFFFFAF6) -val onSecondaryDarkHighContrast = Color(0xFF000000) -val secondaryContainerDarkHighContrast = Color(0xFFD8CAA5) -val onSecondaryContainerDarkHighContrast = Color(0xFF000000) -val tertiaryDarkHighContrast = Color(0xFFF0FFEE) -val onTertiaryDarkHighContrast = Color(0xFF000000) -val tertiaryContainerDarkHighContrast = Color(0xFFB0D4B3) -val onTertiaryContainerDarkHighContrast = Color(0xFF000000) -val errorDarkHighContrast = Color(0xFFFFF9F9) -val onErrorDarkHighContrast = Color(0xFF000000) -val errorContainerDarkHighContrast = Color(0xFFFFBAB1) -val onErrorContainerDarkHighContrast = Color(0xFF000000) -val backgroundDarkHighContrast = Color(0xFF16130B) -val onBackgroundDarkHighContrast = Color(0xFFE9E2D4) -val surfaceDarkHighContrast = Color(0xFF16130B) -val onSurfaceDarkHighContrast = Color(0xFFFFFFFF) -val surfaceVariantDarkHighContrast = Color(0xFF4C4639) -val onSurfaceVariantDarkHighContrast = Color(0xFFFFFAF6) -val outlineDarkHighContrast = Color(0xFFD3CAB8) -val outlineVariantDarkHighContrast = Color(0xFFD3CAB8) -val scrimDarkHighContrast = Color(0xFF000000) -val inverseSurfaceDarkHighContrast = Color(0xFFE9E2D4) -val inverseOnSurfaceDarkHighContrast = Color(0xFF000000) -val inversePrimaryDarkHighContrast = Color(0xFF342900) -val surfaceDimDarkHighContrast = Color(0xFF16130B) -val surfaceBrightDarkHighContrast = Color(0xFF3D392F) -val surfaceContainerLowestDarkHighContrast = Color(0xFF110E07) -val surfaceContainerLowDarkHighContrast = Color(0xFF1E1B13) -val surfaceContainerDarkHighContrast = Color(0xFF231F17) -val surfaceContainerHighDarkHighContrast = Color(0xFF2D2A21) -val surfaceContainerHighestDarkHighContrast = Color(0xFF38342B) - - - - - - - diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Theme.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Theme.kt deleted file mode 100644 index 369d7df3..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/theme/Theme.kt +++ /dev/null @@ -1,217 +0,0 @@ -package com.rtbishop.look4sat.presentation.theme -import android.app.Activity -import android.os.Build -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.LocalOverscrollConfiguration -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Shapes -import androidx.compose.material3.lightColorScheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.Typography -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.core.view.WindowCompat -import com.rtbishop.look4sat.MainApplication - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun MainTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - dynamicColor: Boolean = true, - content: @Composable () -> Unit -) { - val view = LocalView.current - - if (view.isInEditMode) MaterialTheme( - colorScheme = lightScheme, - typography = typography, - shapes = shapes - ) { - CompositionLocalProvider(LocalOverscrollConfiguration.provides(null), content = content) - } - else { - val otherSettings by (LocalContext.current.applicationContext as MainApplication).container.settingsRepo.otherSettings.collectAsState() - val isOldScheme = otherSettings.stateOfOldScheme - val colorScheme = when { - isOldScheme -> oldScheme - - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> darkScheme - else -> lightScheme - } - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = colorScheme.background.toArgb() - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = - if (isOldScheme) false else !darkTheme - } - MaterialTheme(colorScheme = colorScheme, typography = typography, shapes = shapes) { - CompositionLocalProvider(LocalOverscrollConfiguration.provides(null), content = content) - } - } -} - -private val typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ), titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp - ), labelSmall = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Medium, - fontSize = 11.sp, - lineHeight = 16.sp, - letterSpacing = 0.5.sp - ) -) - -private val shapes = Shapes( - extraSmall = RoundedCornerShape(4.dp), small = RoundedCornerShape(6.dp), // buttons corners - medium = RoundedCornerShape(8.dp), // cards corners - large = RoundedCornerShape(12.dp), extraLarge = RoundedCornerShape(16.dp) -) - -private val accentYellow = Color(0xFFFFE082) -private val textWhite = Color(0xCCFFFFFF) -private val textGrey = Color(0x66FFFFFF) -private val textBlack = Color(0xFF000000) -private val surfaceInverse = Color(0x40FFFFFF) -private val surfaceBtn = Color(0xFF303030) -private val surfaceCard = Color(0xFF1C1C1C) -private val surfaceBg = Color(0xFF121212) -private val transparent = Color(0x00000000) -private val oldScheme = lightColorScheme( - primary = accentYellow, - onPrimary = textBlack, -// primaryContainer = primaryContainer, -// onPrimaryContainer = onPrimaryContainer, -// inversePrimary = inversePrimary, - secondary = accentYellow, - onSecondary = textBlack, - secondaryContainer = surfaceInverse, // navBar indicator - onSecondaryContainer = textBlack, // navBar active icon - tertiary = surfaceBtn, - onTertiary = textWhite, -// tertiaryContainer = tertiaryContainer, -// onTertiaryContainer = onTertiaryContainer, - background = surfaceBg, - onBackground = textWhite, - surface = surfaceCard, - onSurface = textWhite, - surfaceVariant = surfaceCard, - onSurfaceVariant = textGrey, // navBar inactive icon - surfaceTint = transparent, - inverseSurface = surfaceInverse, -// inverseOnSurface = inverseOnSurface, -// error = error, -// onError = onError, -// errorContainer = errorContainer, -// onErrorContainer = onErrorContainer, -// outline = outline, -// outlineVariant = outlineVariant, -// scrim = scrim, -) - -private val lightScheme = lightColorScheme( - primary = primaryLight, - onPrimary = onPrimaryLight, - primaryContainer = primaryContainerLight, - onPrimaryContainer = onPrimaryContainerLight, - secondary = secondaryLight, - onSecondary = onSecondaryLight, - secondaryContainer = secondaryContainerLight, - onSecondaryContainer = onSecondaryContainerLight, - tertiary = tertiaryLight, - onTertiary = onTertiaryLight, - tertiaryContainer = tertiaryContainerLight, - onTertiaryContainer = onTertiaryContainerLight, - error = errorLight, - onError = onErrorLight, - errorContainer = errorContainerLight, - onErrorContainer = onErrorContainerLight, - background = backgroundLight, - onBackground = onBackgroundLight, - surface = surfaceLight, - onSurface = onSurfaceLight, - surfaceVariant = surfaceVariantLight, - onSurfaceVariant = onSurfaceVariantLight, - outline = outlineLight, - outlineVariant = outlineVariantLight, - scrim = scrimLight, - inverseSurface = inverseSurfaceLight, - inverseOnSurface = inverseOnSurfaceLight, - inversePrimary = inversePrimaryLight, - surfaceDim = surfaceDimLight, - surfaceBright = surfaceBrightLight, - surfaceContainerLowest = surfaceContainerLowestLight, - surfaceContainerLow = surfaceContainerLowLight, - surfaceContainer = surfaceContainerLight, - surfaceContainerHigh = surfaceContainerHighLight, - surfaceContainerHighest = surfaceContainerHighestLight, -) - -private val darkScheme = darkColorScheme( - primary = primaryDark, - onPrimary = onPrimaryDark, - primaryContainer = primaryContainerDark, - onPrimaryContainer = onPrimaryContainerDark, - secondary = secondaryDark, - onSecondary = onSecondaryDark, - secondaryContainer = secondaryContainerDark, - onSecondaryContainer = onSecondaryContainerDark, - tertiary = tertiaryDark, - onTertiary = onTertiaryDark, - tertiaryContainer = tertiaryContainerDark, - onTertiaryContainer = onTertiaryContainerDark, - error = errorDark, - onError = onErrorDark, - errorContainer = errorContainerDark, - onErrorContainer = onErrorContainerDark, - background = backgroundDark, - onBackground = onBackgroundDark, - surface = surfaceDark, - onSurface = onSurfaceDark, - surfaceVariant = surfaceVariantDark, - onSurfaceVariant = onSurfaceVariantDark, - outline = outlineDark, - outlineVariant = outlineVariantDark, - scrim = scrimDark, - inverseSurface = inverseSurfaceDark, - inverseOnSurface = inverseOnSurfaceDark, - inversePrimary = inversePrimaryDark, - surfaceDim = surfaceDimDark, - surfaceBright = surfaceBrightDark, - surfaceContainerLowest = surfaceContainerLowestDark, - surfaceContainerLow = surfaceContainerLowDark, - surfaceContainer = surfaceContainerDark, - surfaceContainerHigh = surfaceContainerHighDark, - surfaceContainerHighest = surfaceContainerHighestDark, -) diff --git a/app/src/main/res/drawable/ic_calendar.xml b/app/src/main/res/drawable/ic_calendar.xml new file mode 100644 index 00000000..361a3ec7 --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_direction.xml b/app/src/main/res/drawable/ic_direction.xml new file mode 100644 index 00000000..1c9f2aae --- /dev/null +++ b/app/src/main/res/drawable/ic_direction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 675103b6..43d443ee 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -162,6 +162,7 @@ • Обновлять данные автоматически • Показывать анимацию радара • Использовать сенсоры устройства + • Использовать светлую тему Я хотел бы сказать спасибо: • Вам за использование этого приложения! \nЖелаю всегда чистого неба над головой! @@ -178,5 +179,4 @@ за интерес к приложению и публикацию интервью на сайте. Это ПО поставляется без гарантий. - • Используйте старую цветовую схему. diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 8ffb92cb..62968a5c 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -162,6 +162,7 @@ • ස්වයං දත්ත යාවත්කාලීනය • radar sweep සජීවිකරණය සබල කරන්න • Radar දර්ශනය කරකැවීමට සංවේදක භාවිතා කරන්න + • සැහැල්ලු තේමාව භාවිතා කරන්න මම ස්තුති කිරීමට කැමති: • බාගෙන භාවිතා කළ ඔබට! \nඅහස සදා ඔබ වෙනුවෙන් පැහැදිලියි! @@ -175,5 +176,4 @@ SatNOGSWeb අඩවියට API හා DB විශාල දත්ත ප්‍රමාණයක් ලබාදීම සඳහා. \n• DownloadAstro කණ්ඩායමට යෙදුම පිළිබඳ ඔවුන්ගේ උනන්දුව සහ කැපවීම ලැබිම සම්බන්ධයෙන්. මෘදුකාංගය වගකීමක් සමග නොලැබේ - • පැරණි වර්ණ පටිපාටිය භාවිතා කරන්න diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 309d6eff..1118a741 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -162,6 +162,7 @@ • 启用卫星数据自动更新 • 启用雷达扫描动画 • 使用传感器旋转雷达视图 + • 使用旧版配色方案 我要感谢: • 感谢下载和使用 Look4Sat!愿你的天空永远晴朗! @@ -179,5 +180,4 @@ team for their interest to the app and the interview published. 该应用程序不提供任何保修. - • 使用旧版配色方案 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a4bcf06..1946235c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,7 +77,7 @@ %s Id:%05d AOS - %.1f° - Az: %03d° -> Az: %03d° + %03d° -> %03d° Elevation: %.1f° %.1f° - LOS Altitude: %d km @@ -165,6 +165,7 @@ • Enable automatic data update • Enable radar sweep animation • Use sensors to rotate radar view + • Use light theme I would like to say thanks to: • You for downloading and using Look4Sat! \nMay your sky always be clear! @@ -180,5 +181,4 @@ team for their interest to the app and the interview published. The app comes with no warranty. - • Use the old color scheme diff --git a/data/src/main/java/com/rtbishop/look4sat/data/repository/SettingsRepo.kt b/data/src/main/java/com/rtbishop/look4sat/data/repository/SettingsRepo.kt index ac022891..1dc142e4 100644 --- a/data/src/main/java/com/rtbishop/look4sat/data/repository/SettingsRepo.kt +++ b/data/src/main/java/com/rtbishop/look4sat/data/repository/SettingsRepo.kt @@ -19,9 +19,9 @@ package com.rtbishop.look4sat.data.repository import android.content.SharedPreferences import android.location.LocationManager +import android.os.CancellationSignal import androidx.core.content.edit import androidx.core.location.LocationManagerCompat -import androidx.core.os.CancellationSignal import com.rtbishop.look4sat.domain.model.DatabaseState import com.rtbishop.look4sat.domain.model.OtherSettings import com.rtbishop.look4sat.domain.model.PassesSettings @@ -53,7 +53,7 @@ class SettingsRepo(private val manager: LocationManager, private val preferences private val keyStateOfSensors = "stateOfSensors" private val keyStateOfSweep = "stateOfSweep" private val keyStateOfUtc = "stateOfUtc" - private val keyStateOfOldScheme = "stateOfOldScheme" + private val keyStateOfLightTheme = "stateOfLightTheme" private val keyStationAltitude = "stationAltitude" private val keyStationLatitude = "stationLatitude" private val keyStationLongitude = "stationLongitude" @@ -222,9 +222,9 @@ class SettingsRepo(private val manager: LocationManager, private val preferences _otherSettings.value = otherSettings.value.copy(stateOfUtc = value) } - override fun setStateOfOldScheme(value: Boolean){ - preferences.edit { putBoolean(keyStateOfOldScheme, value) } - _otherSettings.value = otherSettings.value.copy(stateOfOldScheme = value) + override fun setStateOfLightTheme(value: Boolean){ + preferences.edit { putBoolean(keyStateOfLightTheme, value) } + _otherSettings.value = otherSettings.value.copy(stateOfLightTheme = value) } private fun getOtherSettings(): OtherSettings { @@ -232,8 +232,8 @@ class SettingsRepo(private val manager: LocationManager, private val preferences val stateOfSensors = preferences.getBoolean(keyStateOfSensors, true) val stateOfSweep = preferences.getBoolean(keyStateOfSweep, true) val stateOfUtc = preferences.getBoolean(keyStateOfUtc, false) - val stateOfOldScheme = preferences.getBoolean(keyStateOfOldScheme,false) - return OtherSettings(stateOfAutoUpdate, stateOfSensors, stateOfSweep, stateOfUtc,stateOfOldScheme) + val stateOfLightTheme = preferences.getBoolean(keyStateOfLightTheme,false) + return OtherSettings(stateOfAutoUpdate, stateOfSensors, stateOfSweep, stateOfUtc, stateOfLightTheme) } //endregion diff --git a/domain/src/main/java/com/rtbishop/look4sat/domain/model/Settings.kt b/domain/src/main/java/com/rtbishop/look4sat/domain/model/Settings.kt index 9fe282b8..8455e840 100644 --- a/domain/src/main/java/com/rtbishop/look4sat/domain/model/Settings.kt +++ b/domain/src/main/java/com/rtbishop/look4sat/domain/model/Settings.kt @@ -1,13 +1,21 @@ package com.rtbishop.look4sat.domain.model -data class DatabaseState(val numberOfRadios: Int, val numberOfSatellites: Int, val updateTimestamp: Long) +data class DatabaseState( + val numberOfRadios: Int, + val numberOfSatellites: Int, + val updateTimestamp: Long +) -data class PassesSettings(val hoursAhead: Int, val minElevation: Double, val selectedModes: List) +data class PassesSettings( + val hoursAhead: Int, + val minElevation: Double, + val selectedModes: List +) data class OtherSettings( val stateOfAutoUpdate: Boolean, val stateOfSensors: Boolean, val stateOfSweep: Boolean, val stateOfUtc: Boolean, - val stateOfOldScheme: Boolean + val stateOfLightTheme: Boolean ) diff --git a/domain/src/main/java/com/rtbishop/look4sat/domain/repository/ISettingsRepo.kt b/domain/src/main/java/com/rtbishop/look4sat/domain/repository/ISettingsRepo.kt index f61bd377..6beb0da5 100644 --- a/domain/src/main/java/com/rtbishop/look4sat/domain/repository/ISettingsRepo.kt +++ b/domain/src/main/java/com/rtbishop/look4sat/domain/repository/ISettingsRepo.kt @@ -55,7 +55,7 @@ interface ISettingsRepo { fun setStateOfSensors(value: Boolean) fun setStateOfSweep(value: Boolean) fun setStateOfUtc(value: Boolean) - fun setStateOfOldScheme(value: Boolean) + fun setStateOfLightTheme(value: Boolean) //endregion //region # Undefined settings diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3292af0e..a5e27df6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,29 +1,29 @@ [versions] -android-gradle-plugin = "8.3.0" -google-ksp = "1.9.22-1.0.17" -kotlin = "1.9.22" +android-gradle-plugin = "8.5.0" +google-ksp = "1.9.24-1.0.20" +kotlin = "1.9.24" -androidx-core-ktx = "1.12.0" +androidx-core-ktx = "1.13.1" androidx-core-splashscreen = "1.0.1" androidx-room = "2.6.1" -compose = "1.6.3" -compose-activity = "1.8.2" -compose-compiler = "1.5.10" -compose-lifecycle = "2.7.0" +compose = "1.6.8" +compose-activity = "1.9.0" +compose-compiler = "1.5.14" +compose-lifecycle = "2.8.2" compose-material3 = "1.2.1" compose-navigation = "2.7.7" -other-coroutines = "1.7.3" -other-json = "20231013" +other-coroutines = "1.8.1" +other-json = "20240303" other-okhttp = "4.12.0" -other-osmdroid = "6.1.17" +other-osmdroid = "6.1.18" test-junit4 = "4.13.2" -test-mockk = "1.13.9" +test-mockk = "1.13.11" -androidTest-junit = "1.1.5" -androidTest-espresso = "3.5.1" +androidTest-junit = "1.2.0" +androidTest-espresso = "3.6.0" [libraries] androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core-ktx" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41384758..f314c00c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Sep 01 22:09:30 BST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists