From fdbdc513f1604879eff4f3e8905cb759c12fe8e2 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 12 Jan 2025 17:42:02 +0000 Subject: [PATCH] Implemented a basic map data card on MapScreen --- app/build.gradle.kts | 7 +- app/proguard-rules.pro | 14 --- .../look4sat/presentation/map/MapScreen.kt | 88 +++++++++++------- .../presentation/radar/RadarScreen.kt | 34 ++++++- .../look4sat/presentation/radar/RadarView.kt | 6 +- .../ic_launcher.xml | 0 .../ic_launcher_round.xml | 0 .../main/res/mipmap-nodpi/ic_launcher.webp | Bin 0 -> 2560 bytes .../res/mipmap-nodpi/ic_launcher_round.webp | Bin 0 -> 5314 bytes data/build.gradle.kts | 2 +- gradle/libs.versions.toml | 12 +-- gradle/wrapper/gradle-wrapper.properties | 4 +- 12 files changed, 102 insertions(+), 65 deletions(-) rename app/src/main/res/{mipmap => mipmap-anydpi-v26}/ic_launcher.xml (100%) rename app/src/main/res/{mipmap => mipmap-anydpi-v26}/ic_launcher_round.xml (100%) create mode 100644 app/src/main/res/mipmap-nodpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-nodpi/ic_launcher_round.webp diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ba7daedd..5ed56135 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,11 +14,10 @@ android { compileSdk = 35 defaultConfig { applicationId = "com.rtbishop.look4sat" - minSdk = 26 + minSdk = 24 targetSdk = 35 - versionCode = 314 - versionName = "3.1.4" - resourceConfigurations.addAll(listOf("en", "ru", "si", "zh-rCN", "anydpi")) + versionCode = 400 + versionName = "4.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildFeatures { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c5b80038..e69de29b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,14 +0,0 @@ -# JSR 305 annotations are for embedding nullability information. --dontwarn javax.annotation.** - -# A resource is loaded with a relative path so the package of this class must be preserved. --adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz - -# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. --dontwarn org.codehaus.mojo.animal_sniffer.* - -# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. --dontwarn okhttp3.internal.platform.** --dontwarn org.conscrypt.** --dontwarn org.bouncycastle.** --dontwarn org.openjsse.** 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 c24105b5..5bf39a5a 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 @@ -10,18 +10,26 @@ import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.State import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle @@ -86,6 +94,7 @@ private fun MapScreen(uiState: State) { val rotateMod = Modifier.rotate(180f) val timeString = uiState.value.mapData?.aosTime ?: "00:00:00" val isTimeAos = uiState.value.mapData?.isTimeAos ?: true + val osmInfo = "Wikimedia maps | Map data © OpenStreetMap contributors" Column(modifier = Modifier.padding(6.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) { TimerRow { CardIcon(onClick = selectPrev, iconId = R.drawable.ic_arrow, modifier = rotateMod) @@ -93,14 +102,48 @@ private fun MapScreen(uiState: State) { CardIcon(onClick = selectNext, iconId = R.drawable.ic_arrow) } NextPassRow(pass = uiState.value.orbitalPass) - ElevatedCard(modifier = Modifier.fillMaxSize()) { - MapView(modifier = Modifier.fillMaxSize(), isLightUi = uiState.value.isLightUi) { mapView -> - uiState.value.stationPosition?.let { setStationPosition(it, mapView) } - uiState.value.positions?.let { setPositions(it, mapView, onItemClick) } - uiState.value.track?.let { setSatelliteTrack(it, mapView) } - uiState.value.footprint?.let { setFootprint(it, mapView) } + ElevatedCard(modifier = Modifier.weight(1f)) { + Box(contentAlignment = Alignment.BottomCenter) { + MapView(isLightUi = uiState.value.isLightUi) { mapView -> + uiState.value.stationPosition?.let { setStationPosition(it, mapView) } + uiState.value.positions?.let { setPositions(it, mapView, onItemClick) } + uiState.value.track?.let { setSatelliteTrack(it, mapView) } + uiState.value.footprint?.let { setFootprint(it, mapView) } + } + Text(text = osmInfo, textAlign = TextAlign.Center, fontSize = 14.sp) } } + uiState.value.mapData?.let { mapData -> + ElevatedCard { + MapDataCard(mapData) + } + } + } +} + +@Composable +private fun MapDataCard(mapData: MapData) { + Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp)) { + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.map_period, mapData.period), color = MaterialTheme.colorScheme.primary) + Text(text = stringResource(R.string.map_phase, mapData.phase), color = MaterialTheme.colorScheme.primary) + } + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.map_azimuth, mapData.azimuth)) + Text(text = stringResource(R.string.map_elevation, mapData.elevation)) + } + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.map_altitude, mapData.altitude), color = MaterialTheme.colorScheme.primary) + Text(text = stringResource(R.string.map_distance, mapData.range), color = MaterialTheme.colorScheme.primary) + } + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.map_latitude, mapData.osmPos.latitude)) + Text(text = stringResource(R.string.map_longitude, mapData.osmPos.longitude)) + } + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Text(text = stringResource(R.string.map_qth, mapData.qthLoc), color = MaterialTheme.colorScheme.primary) + Text(text = stringResource(R.string.map_velocity, mapData.velocity), color = MaterialTheme.colorScheme.primary) + } } } @@ -195,30 +238,6 @@ private fun setFootprint(orbitalPos: OrbitalPos, mapView: MapView) { } } -//private fun handleMapData(mapData: MapData) { -// binding.apply { -// mapTimer.text = mapData.aosTime -// mapDataPeriod.text = String.format(getString(R.string.map_period, mapData.period)) -// mapDataPhase.text = String.format(getString(R.string.map_phase), mapData.phase) -// mapAzimuth.text = String.format(getString(R.string.map_azimuth), mapData.azimuth) -// mapElevation.text = String.format(getString(R.string.map_elevation), mapData.elevation) -// mapDataAlt.text = String.format(getString(R.string.map_altitude), mapData.altitude) -// mapDataDst.text = String.format(getString(R.string.map_distance), mapData.range) -// mapDataLat.text = -// String.format(getString(R.string.map_latitude), mapData.osmPos.lat) -// mapDataLon.text = -// String.format(getString(R.string.map_longitude), mapData.osmPos.lon) -// mapDataQth.text = String.format(getString(R.string.map_qth), mapData.qthLoc) -// mapDataVel.text = String.format(getString(R.string.map_velocity), mapData.velocity) -// if (mapData.eclipsed) { -// mapDataVisibility.text = getString(R.string.map_eclipsed) -// } else { -// mapDataVisibility.text = getString(R.string.map_visible) -// } -// } -// binding.mapView.invalidate() -//} - @Composable private fun MapView( modifier: Modifier = Modifier, @@ -237,9 +256,10 @@ private fun rememberMapViewWithLifecycle(isLightTheme: Boolean): MapView { setMultiTouchControls(true) setUseDataConnection(false) setTileSource(tileSource) - minZoomLevel = getMinZoom(resources.displayMetrics.heightPixels) + 0.25 - maxZoomLevel = 8.0 - controller.setZoom(minZoomLevel + 1) + minZoomLevel = getMinZoom(resources.displayMetrics.heightPixels) + maxZoomLevel = 7.0 + controller.setCenter(GeoPoint(48.8575, 6.3514)) + controller.setZoom(minZoomLevel + 2) zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER) overlayManager.tilesOverlay.loadingBackgroundColor = Color.TRANSPARENT overlayManager.tilesOverlay.loadingLineColor = Color.TRANSPARENT 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 c0d1a4c8..21f6703b 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 @@ -1,8 +1,15 @@ package com.rtbishop.look4sat.presentation.radar +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.tween import androidx.compose.foundation.MarqueeSpacing import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -23,6 +30,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource @@ -80,7 +88,7 @@ private fun RadarScreen(uiState: RadarState, navigateBack: () -> Unit) { CardIcon(onClick = addToCalendar, iconId = R.drawable.ic_calendar) } NextPassRow(pass = uiState.currentPass ?: getDefaultPass()) - Box(contentAlignment = Alignment.Center, modifier = Modifier.aspectRatio(1f)) { + Box(contentAlignment = Alignment.BottomCenter, modifier = Modifier.aspectRatio(1f)) { uiState.orbitalPos?.let { position -> ElevatedCard { RadarViewCompose( @@ -127,6 +135,30 @@ private fun RadarScreen(uiState: RadarState, navigateBack: () -> Unit) { ) } } + if (uiState.orbitalPos.eclipsed) { + val infiniteTransition = rememberInfiniteTransition() + val textAlpha = infiniteTransition.animateFloat( + initialValue = 1.0f, + targetValue = 0.0f, + animationSpec = infiniteRepeatable( + animation = tween( + durationMillis = 500, + delayMillis = 25, + easing = LinearEasing + ), + repeatMode = RepeatMode.Reverse + )) + Text( + text = "Eclipsed!", + fontSize = 18.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier + .alpha(textAlpha.value) + .border(2.dp, MaterialTheme.colorScheme.primary, MaterialTheme.shapes.medium) + .padding(16.dp) + ) + } } } ElevatedCard(modifier = Modifier.fillMaxSize()) { 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 cfdd72ee..9d0a97fb 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 @@ -53,7 +53,7 @@ fun RadarViewCompose( val radarColor = MaterialTheme.colorScheme.secondary val trackColor = MaterialTheme.colorScheme.primary val aimColor = MaterialTheme.colorScheme.error - val strokeWidth = 4f + val strokeWidth = 6f val animTransition = rememberInfiniteTransition(label = "animScale") val animSpec = infiniteRepeatable(tween(1000)) val animScale = animTransition.animateFloat(16f, 64f, animSpec, label = "animScale") @@ -167,7 +167,7 @@ private fun DrawScope.drawInfo(radius: Float, color: Color, measurer: TextMeasur } private fun DrawScope.drawTrack(path: Path, effect: PathEffect, color: Color, effectColor: Color) { - drawPath(path, color, style = Stroke(4f)) + drawPath(path, color, style = Stroke(6f)) drawPath(path, effectColor, style = Stroke(pathEffect = effect)) } @@ -213,7 +213,7 @@ private fun createTrackPath(positions: List, radius: Float): Path { private fun createTrackEffect(trackPath: Path): PathEffect { val shape = Path() - val shapeRadius = 16f + val shapeRadius = 24f val angle = 120.0.toRadians() shape.moveTo((shapeRadius * cos(angle)).toFloat(), (shapeRadius * sin(angle)).toFloat()) for (i in 1 until 3) { diff --git a/app/src/main/res/mipmap/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/app/src/main/res/mipmap/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from app/src/main/res/mipmap/ic_launcher_round.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/app/src/main/res/mipmap-nodpi/ic_launcher.webp b/app/src/main/res/mipmap-nodpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..24aea602b83eed1778c8e291342baee4c4e3428c GIT binary patch literal 2560 zcmV+b3jg&|Nk&Ha2><|BMM6+kP&il$0000G0002L006%L06|PpNSXow01c1hpp7I) zI`@PN|IZ)sJ%)(L!~gOQZ6JZ!P*-Airu-_H&1`C}L{~>tS*xUJBtd&awr$&K-RylN zCn+;CGjpKK4V0M~Z0qd*e=J%VR-f7%(fRU7_14-V@N$1`j-)O~v$Cu}Cj$bMxkpo<6Mlf|{&AxSu76kPi{nPtr zGcUGn#n*~7WGT6;jl=cy%*#0u>^XS)vTDb+;csoE8FP`l51 z06vjOpi8BsqamWW31F}i31e>HpPh+bd%gc(=QVHbw;*^%c%k%^^Ec$}lK9$kT0Ywn+}R&h(0Cogr@>6QoqB_j-{MVv zZ`DrCpj-(`NR3y4^Sh9gaYt)l5}RIiz?@lmcsZ_HP+o4|AnMPc9B>*iv>Yl*4Evo? zI}f!xO|wEpR*%}SZgJhpD87ol)PF5s%#1ZIV)am+ZAVvd1z*E+Osgm+A~n|i-~j&o ztq?;Wi}%cnhuOr$w8dv4?^gn{U7XAS0^@PiE|Me|AH3ZYpUA7}5EovbxbJ^~z6%yXItIF++ zq_t=C;DO1i0Pjn-%+Oc00c#g3vb|C$Mu~)gmifhCS2r6ZRV)jzYKF7sC2c1kH)0}u ze;oe}`v!9K?DF)u=VNMT-Q6%M9L-*=XOVzMj#v1@lYBl4K8vtu6L#R`Q1lP`fawwa ziSXt%=JW^>$2(|p!2vCC^%>#!q^AdK1whDb6EsEcoo?##_?t%yLIlOhG1A~@j7wHB z)qM%ju|`69a{A1)$Zc7g_#vU)RlZA;C|t!jWkPb7a$0@fQ|n`&!dq?d_=+F2|>HuYTDM}kUIa$HMihP!8rf=x+i!bSnzae`b~%)1smJw~zh zoW9qzM;jsEz_W(09qzR9=V9forikk7o zXh5&Fp&S=elpS~f(wQ+o?hYG@|J=^IP5roa$)`S4UVBQV_DIfQy=n5`MjlV!D&E>G z&F&-(D)V|@XgS@FE+6U5eCIXCTlUDqSQ>(dC`@#3LGiZiLzA$(_2K5km^+&kanTls z-@biwr-(#>a#S;v?tf>e8i@3BCunj~;w)|>EiPA9&tb-CN{otvFBg-QMJ{R?c2F1| zh7m4wlWkl0>rxZh*O)FWTQ8gSWWvZ&j_-sCLs|sKQo^n&ULQ8>$|ab)uaQ`3`n`YW ztTz{3^tQdBQBjsXa16e-g?aMs1})^9PIWT#SF~i&n$_Cwmf#FeAB&R#qd*qEZ1ZbD zy&a6TKC5;0h;46H4%*nI{ z12?WGO7Vp_C`vp|>v&l7!Sfs1Uhv}2h~!&_2zB&jW>6h_H<672{{hetJxf|tM=ArN zqwIK_AQhnJVRBhuj`E*mK02Zm&~jH>ZR$Y%DX(XgUx;!0R9nr2ExCdSAlG+Z^xLR= zH1I-&e`O&T9gmGUYw+i2@uwZNT{}2o#}_EYdE?&Or`P^9ppMl3&m0Ntsw@K!Mze3YIG# z0%*w22?lXTLtXIMCY~iuv--{9&A~W$FBrbxFmmNJw$IUb=dMxKC8VllA)R_VtM?|D z6gRxok9TUD3<-X^oH>m7^9Sm|M~P_i9AodjnLM{^OT5Y*aBDjyQ(hJ4XZZhRCD&%L z1eY4YaPa|Qxiw*S`1Ih8kA_^d$ZTZW#EF{ushIri!6K<0kx|v*qE49Fl2&grZR?Qd zF8QL`D+Dj|6(Q0ynV)|<_cMdv-0(NtB9;Dq8Ev&a1zq-fvU+-!hYpgGJ^in!>u1{yEWX z=wmdg<-hYw?c4M;l?D(8!h}EyN!o6>QOzPxqn;A>X%#c$2uWelT2?|EQ(Vmn<_>e@ W@1PHumHn383z$+tpr}9q0001Kfap~K literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-nodpi/ic_launcher_round.webp b/app/src/main/res/mipmap-nodpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..f69a68259f0a9f99d9b5e20a50b62ddd36eb5077 GIT binary patch literal 5314 zcmV;z6g}%wNk&Gx6aWBMMM6+kP&il$0000G0002L006%L06|PpNZtzo009|=ZQC}G z?WFVnhub3}`X3k~zgz(6n*p!UU|UBZkhH(~1QC%MplRDk$DexEyZ=nV5s?$%3EMVh zZfx87Q&urgySN53Gcz;H7V~V**<@<+oUM7y9y2rZ9L&r-MlmzGtdJT~rBbQPXg@N% zU)j!h4H+ugVTy*b{=W*yn{i`sCaR{NW#I=C!Kl5siz%X-?YZIbl<&) zPTYOhv|G9e+xbzXITr7}@X?n(V&6sQoqP7~Q)`tvJ8|OfJ8rx6y32Q6{f+DQc8h22 z$ca*%I#_?ylb-&>CttXwF!;FX`Y(Lx(_j47eZZz(L>?3^1eC`=_eIZ|oX29@OQ;Vo zA&JG?zx2rue(Wm&MUJsoNgby@>ou=<`WArXp45p!8{66haMNer{lAlYI%*wjnvK+* zbo9-yf5s_5S}0OCjCQC3TMz%&za83^qV>jADRbu0Z~yieoC2{RiD9;_0$V@)_m9S{ zlyOvhsne@};b$&@mKQQWSNo+mSk^dw%d7n##CPN!=OSf9wcuWs_L-s->ADKlmx};-H296-9yLr(aMMt96t;Tg%Ms1hmV6sk<89l zTuiHs_}Yk9?!>*3Gn2X}zZeiBU%(5W(xozD1W$W3tuhv88jpDzXtXf%gfl^m$pZU# zRYvQ%dq9j)!JdO7<=ZYJsT-?G-I2|sLU7I@EXJ(Np`D;nVD|3EV(iN7K8Qzv*?l@= zd&h3P>ZDrHxDs_%T3r@%jQP~bs|oHJe>=O?ef!;v{k{8FlkeDx$DP@Gn^%ju`Bt)U z_c~q`X7?2+2gH@P;8kGwI>kBQ!nfw}(0P_GQcM=Q@MW5Z4L-LYlZj^IGu^P;`}Sb6 z(H#E*9;(otA0ab8v7HzqH~ya%IT4L_(-wv&_`pGetPHMs55p7IIvKj}a;G72^FPy^ z8*cntG!F^y`U@7U^`Kp6)c`Y%UL9u_kVjv}*{OZoiAIz&x zcNvJE@?a-2SUlyZ>LA2Ramga@f2A1U%(k_c6E%y1m#n2S0AIR=Y<|*Xdv$r@S)e=; z7r#JSmgeiTiP=0V!E;JzIVIJ7os~zJXPoT19I?KGjDF-}q~$$2D7jR)@Zhp!J(c;I zON#O|S<8s}1gu=bJbq?5u=Xgj`q&PZS$xjUyt?Fk)&9g~ccFX|XFpo%OC^qwS7$t2 zRsDc2W}#%1Sr`4gtYhU9<`T{K7qb`T)4*Wo1#n;K|U0ZuW-^O2N#<}Fe*NpqJBlb;{Pnv!)Z1)3>ZyhG1 zum5V8{+(j|Xy;rqS6m&*%ZL)6qBxIS`23_S!`SheIpvblr=v6O2b|&yd%JADb{ffD z|8|S@!}+xDs@P`thePRu-Hda{g^x{3m}Ry2=!4`Dw|*envW#0g{;6F0Qcc_3xj*dG zrFV73`QyUA3CZr3>-ogK8(~ZO3{(PbY(6z9 zXOvF4=%x;&K>(_{>v4swEsvb4i9t(n-Ifx)d{OAagGd^XfLY!BP$6T>rE{FL02&M+ zeDDOJTv2fTH$!6J60GUY%SyhK3#Y7sG^oXngQqK$CkmalC(KH3(v9ndOf47O#w;st zu2r>iM6Rb^fdQ?AV8-9r(sPbj=k0X`v62F!-f{04Wa*A=H`f5P5?~vD?i3~EhLTSE z?7SB2Ze;~TjlElD$j)-^wR1Iq-pT+be9f`yUS_!7cbvcsqb+}8O_3F{PX4%MGbB;d zp0j7Nf^z2N(;7o!aO0ZmW}Opm>sK&m@G$hSO?+x=&&mZ^?PDR^Xcz!HN*pT1x!|Ht zgu-TM?MT}B`3Flbl(nzjt~6wh#+6@LlXJkD-SZ9R!ovg(M|}2jGVz*E%-dmx*^Wq^ z_ubg@__J<#uSpU1FbO-F;yv4CjW<~v>!B7l8YZwEjr-SkGWPFYKcN=38FoiR)82QV z#=?u0-s?A8_N8G!$SE%GJ*sQIc!rIF(Wua zBiZg44M;O(Q)#uS_(>NiNh8cr*!59kJ1`?tQYp38R#`vt__bnJBtx)@s{X&(6Ud$+nbU1Ub8gi5KU*1`?vJ@QNi8ad&@_3!_LnTr(RQ3FUS zr54S?`sRn9Tx^Y$pmO(z|9fhtX^GArIjBgbl+t|Xu`QR@UZ9Z?E=)iEuUELtB_M2f zBUnNzDupUvf8XYdN{LP*AzYc8{Nu-hG=&xs?nbtjEUMzlJI}gswqVLCi%{jh5B=r4 z7wl=8YY?_Qsw5UksG7ZNCv7>sM{m%Qp37X$Mk4Ur86xc1ZU`h&|2 z+a_%~Z7t2aW7I7cfB?^wkS=-Qi=K2b!2E)wA+W6iaP1d&9=pn+m`tYA>9nP=?QRT; zB@HHKswFOa_VXTp$>{*GAdm)RgH-_Tx#ppdA3ton*G^0))5)~86ya`MY7t<=Y&)q~ z;_N3rb@GS{&tge?AQDU7dHt?0f9^~Bu{A$8o!&p0Oj}D4?#2h`0nBV`wY6$X+IZxn zAG?0h<{hVXgTD8ko3Fe2Yv0_sD{LuEVXjRklW8Nuof)rMgxNIPT5WY^ttx~lN6&lM zMVl`;_pCEcIk~o~ZXwMvx$nRox7~QlwTEv#5S{Ui)3%_|TANN=i*RSguK>H&T4!r* zwbWLM00cSFX&F zVllze5f0n##=0bxQfgULODQUnR8)Wh1P~6}4o5^<6hwrV?8d&(;!;$#RMFBPz~H50 zDdPw)?o1{Mp~Xc-MJh`m5C*eE*x_(^F~(%2KnN{~BqYRQV`CdHi7}Wg6$pe7h(0hF zV=$P!6^q4^0?d+Tu^G8mP&gpA2mk;OG605106vjOpGzgAqamboIXJKq2~FFp z^XG5=;WuIZcztJ7Q z3)a8jx4Xax)_x~+kWClJPuD)d{UX(H#~!tOE8feiGrzkP}tp~;cggYYa0|dyBFB<4jqrEjIaOUk8l6>;P&ds0->V2 zw*2;291$xN1C81Waf!Rs-v8~jet-YspQcS4SuMPI_0silTy_FMykPuF)=W40OjN&o zj|~6DJ0mE=vTo3QJFvA5T^Cdw_6ja+w(gHUIqv@^{)hxSkqk8(8qN8-QEs`M3mA*3 zQygN$IRGlP%r*G!i{u|EO$T;`Ne;tf+Awm9KQaMo-8<$kekW&&9mMt!vOYb z{X>+BsDxpF)>oTLigXI%4q0oUT7`b4n(-{UBPeUZzlnpq2r^l&0P6zhtx=74xD=4U z-n&ko@k*()Zm$R0iyw#p0RH@~9Ry9{{M#x(N*%<2i&Yu~TO=Q$4&4Y)nctaIUl|Ml z1n>>=r&kNq0D5j`6H7fn5PlmvickT4{+2K*szlWwp&j!+&7E{^0=tm(BE0*_I{15U zPxG7<-^!%JfgV$4>3lAGk7e(w>qLdxlsAvMJVdsen(q)^ry3&)(AqMgv)Q~xyhF>nhxZeM|6&eh}5#uK4p6*640E33-EQPZF zcsy1!5H@yhlq=SqUT22Fz=lZS;kD}8yiO2N|9 zqz;CrI~?$<4BOPF5ucxy5T?|lEdFYT;Wj(>W%}Pv7@EjhO7IF`R1@>EnyBgO5=_C{ zmnxU4SODR&Wy68(NAHC7Z)Hkfj&jEo_ax}V0jmRj#|=%_a5ayKLwzx;I%bUge;Hn7$Ym^DkS_YyusWXn`aI_!eA}+t~0O|(F(u%GGtDbg~ze2Brt zx-MmAa(tS6ohIJ-yx&>R*OM3w9x<>q+!~L*-GVcFkj~`p^ZaLs>I^;sBSeO-Ix4xk0o=oKLuIW! zh(b`E={wAj1R_#eif?bXT5@d8<_ZvJ`h87B?@!W-S! zwk{KCNq=I{s68Z?0FHizrV^g&hqg#d66k?WoSAON^AuG(AH77pevETuzWIvWp7`b} zXl9g7pXaiv=FA{ryimOR`QwXpE0zt&J&V#zTWhyE6TdJWYSTJr-2jb6iNZYd`-FH13U6PZy)S*W1A}>zYLkvo}ilHp=e8TucR3b+W{vn8)|+N9=luSjdh> z;@ajc&B+`9*lx3+tW{R#B*01A)Bxg8Z3#qHSRP-AC3{PZzVkx&_Oo377&6t+7}T*v zxY5Y7wYYb{6E^5PaSh1yNJ-JA65~TbyteB_$-Gq0#c=L4)lG_pi<#$pK_3`=DxSTd z0ei?TmDn&^1U%gwgM^_xD{7NrF@3RrFajnqkv9KL^%>)IUa;D;%itSuzmWhQan9PU U6GUz#@Bn0g41L1ZUEGsk0DI%4kN^Mx literal 0 HcmV?d00001 diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 63d12dcf..aed6f1f3 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -12,7 +12,7 @@ android { namespace = "com.rtbishop.look4sat.data" compileSdk = 35 defaultConfig { - minSdk = 26 + minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4ece4007..bbf55fb8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -android-gradle-plugin = "8.7.3" +android-gradle-plugin = "8.8.0" google-ksp = "2.0.21-1.0.26" kotlin = "2.0.21" @@ -7,18 +7,18 @@ androidx-core-ktx = "1.15.0" androidx-core-splashscreen = "1.0.1" androidx-room = "2.6.1" -compose-bom = "2024.11.00" -compose-activity = "1.9.3" +compose-bom = "2025.01.00" +compose-activity = "1.10.0" compose-lifecycle = "2.8.7" -compose-navigation = "2.8.4" +compose-navigation = "2.8.5" -other-coroutines = "1.9.0" +other-coroutines = "1.10.1" other-json = "20240303" other-okhttp = "4.12.0" other-osmdroid = "6.1.20" test-junit4 = "4.13.2" -test-mockk = "1.13.13" +test-mockk = "1.13.14" androidTest-junit = "1.2.1" androidTest-espresso = "3.6.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d8aae7cb..a6f1f963 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Oct 25 23:59:14 BST 2024 +#Sat Jan 04 21:11:19 GMT 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists