mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Updated to API 36 (Android 16), bumped dependencies
This commit is contained in:
1 parent
bffb4842b1
commit
aa9365b2fd
11 files changed
+48
-47
No files matched your search
@@ -6,16 +6,16 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
jvmToolchain(17)
|
jvmToolchain(21)
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.rtbishop.look4sat"
|
namespace = "com.rtbishop.look4sat"
|
||||||
compileSdk = 35
|
compileSdk = 36
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.rtbishop.look4sat"
|
applicationId = "com.rtbishop.look4sat"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
targetSdk = 35
|
targetSdk = 36
|
||||||
versionCode = 400
|
versionCode = 400
|
||||||
versionName = "4.0.0"
|
versionName = "4.0.0"
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class MainContainer(private val context: Context) {
|
|||||||
|
|
||||||
private fun provideLocalSource(): ILocalSource {
|
private fun provideLocalSource(): ILocalSource {
|
||||||
val builder = Room.databaseBuilder(context, Look4SatDb::class.java, "Look4SatDBv313")
|
val builder = Room.databaseBuilder(context, Look4SatDb::class.java, "Look4SatDBv313")
|
||||||
val database = builder.apply { fallbackToDestructiveMigration() }.build()
|
val database = builder.apply { fallbackToDestructiveMigration(false) }.build()
|
||||||
return LocalSource(database.look4SatDao())
|
return LocalSource(database.look4SatDao())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.rtbishop.look4sat.presentation.components
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
@@ -46,6 +45,7 @@ import com.rtbishop.look4sat.presentation.MainTheme
|
|||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
|
||||||
private val sdfTime = SimpleDateFormat("HH:mm:ss", Locale.ENGLISH)
|
private val sdfTime = SimpleDateFormat("HH:mm:ss", Locale.ENGLISH)
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ fun CardLoadingIndicator() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun gotoUrl(context: Context, url: String) {
|
fun gotoUrl(context: Context, url: String) {
|
||||||
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
|
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDefaultPass(): OrbitalPass {
|
fun getDefaultPass(): OrbitalPass {
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
package com.rtbishop.look4sat.presentation.map
|
package com.rtbishop.look4sat.presentation.map
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.ColorMatrix
|
import android.graphics.ColorMatrix
|
||||||
import android.graphics.ColorMatrixColorFilter
|
import android.graphics.ColorMatrixColorFilter
|
||||||
import android.graphics.Paint
|
import android.graphics.Paint
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.graphics.drawable.BitmapDrawable
|
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
@@ -56,6 +54,9 @@ import org.osmdroid.views.MapView
|
|||||||
import org.osmdroid.views.overlay.FolderOverlay
|
import org.osmdroid.views.overlay.FolderOverlay
|
||||||
import org.osmdroid.views.overlay.Marker
|
import org.osmdroid.views.overlay.Marker
|
||||||
import org.osmdroid.views.overlay.Polyline
|
import org.osmdroid.views.overlay.Polyline
|
||||||
|
import androidx.core.graphics.toColorInt
|
||||||
|
import androidx.core.graphics.createBitmap
|
||||||
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
|
|
||||||
private val minLat = MapView.getTileSystem().minLatitude
|
private val minLat = MapView.getTileSystem().minLatitude
|
||||||
private val maxLat = MapView.getTileSystem().maxLatitude
|
private val maxLat = MapView.getTileSystem().maxLatitude
|
||||||
@@ -69,12 +70,12 @@ private val trackPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|||||||
private val footprintPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
private val footprintPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||||
strokeWidth = 3f
|
strokeWidth = 3f
|
||||||
style = Paint.Style.FILL_AND_STROKE
|
style = Paint.Style.FILL_AND_STROKE
|
||||||
color = Color.parseColor("#FFE082")
|
color = "#FFE082".toColorInt()
|
||||||
}
|
}
|
||||||
private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||||
textSize = 36f
|
textSize = 36f
|
||||||
style = Paint.Style.FILL
|
style = Paint.Style.FILL
|
||||||
color = Color.parseColor("#FFE082")
|
color = "#FFE082".toColorInt()
|
||||||
setShadowLayer(3f, 3f, 3f, Color.BLACK)
|
setShadowLayer(3f, 3f, 3f, Color.BLACK)
|
||||||
}
|
}
|
||||||
private val labelRect = Rect()
|
private val labelRect = Rect()
|
||||||
@@ -205,12 +206,12 @@ private fun getCustomTextIcon(textLabel: String, mapView: MapView): Drawable {
|
|||||||
val iconSize = 10f
|
val iconSize = 10f
|
||||||
val width = labelRect.width() + iconSize * 2f
|
val width = labelRect.width() + iconSize * 2f
|
||||||
val height = textPaint.textSize * 3f + iconSize * 2f
|
val height = textPaint.textSize * 3f + iconSize * 2f
|
||||||
val bitmap = Bitmap.createBitmap(width.toInt(), height.toInt(), Bitmap.Config.ARGB_8888)
|
val bitmap = createBitmap(width.toInt(), height.toInt())
|
||||||
Canvas(bitmap).run {
|
Canvas(bitmap).run {
|
||||||
drawCircle(width / 2f, height / 2f, iconSize, textPaint)
|
drawCircle(width / 2f, height / 2f, iconSize, textPaint)
|
||||||
drawText(textLabel, iconSize / 2f, height - iconSize, textPaint)
|
drawText(textLabel, iconSize / 2f, height - iconSize, textPaint)
|
||||||
}
|
}
|
||||||
return BitmapDrawable(mapView.context.resources, bitmap)
|
return bitmap.toDrawable(mapView.context.resources)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setSatelliteTrack(satTrack: List<List<GeoPos>>, mapView: MapView) {
|
private fun setSatelliteTrack(satTrack: List<List<GeoPos>>, mapView: MapView) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class DatabaseRepo(
|
|||||||
val importedRadios = mutableListOf<SatRadio>()
|
val importedRadios = mutableListOf<SatRadio>()
|
||||||
// fetch
|
// fetch
|
||||||
val jobsMap = Sources.satelliteDataUrls.mapValues { async { remoteSource.getNetworkStream(it.value) } }
|
val jobsMap = Sources.satelliteDataUrls.mapValues { async { remoteSource.getNetworkStream(it.value) } }
|
||||||
val jobRadios = async { remoteSource.getNetworkStream(Sources.radioDataUrl) }
|
val jobRadios = async { remoteSource.getNetworkStream(Sources.RADIO_DATA_URL) }
|
||||||
// parse
|
// parse
|
||||||
jobsMap.mapValues { job -> job.value.await() }.forEach { entry ->
|
jobsMap.mapValues { job -> job.value.await() }.forEach { entry ->
|
||||||
entry.value?.let { stream ->
|
entry.value?.let { stream ->
|
||||||
|
|||||||
@@ -18,13 +18,13 @@
|
|||||||
package com.rtbishop.look4sat.data.source
|
package com.rtbishop.look4sat.data.source
|
||||||
|
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.net.Uri
|
|
||||||
import com.rtbishop.look4sat.domain.source.IRemoteSource
|
import com.rtbishop.look4sat.domain.source.IRemoteSource
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import kotlinx.coroutines.CoroutineDispatcher
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
|
||||||
class RemoteSource(
|
class RemoteSource(
|
||||||
private val dispatcher: CoroutineDispatcher,
|
private val dispatcher: CoroutineDispatcher,
|
||||||
@@ -34,7 +34,7 @@ class RemoteSource(
|
|||||||
|
|
||||||
override suspend fun getFileStream(uri: String): InputStream? = withContext(dispatcher) {
|
override suspend fun getFileStream(uri: String): InputStream? = withContext(dispatcher) {
|
||||||
try {
|
try {
|
||||||
val fileUri = Uri.parse(uri)
|
val fileUri = uri.toUri()
|
||||||
contentResolver.openInputStream(fileUri)
|
contentResolver.openInputStream(fileUri)
|
||||||
} catch (exception: Exception) {
|
} catch (exception: Exception) {
|
||||||
println("RemoteSource file stream exception: $exception")
|
println("RemoteSource file stream exception: $exception")
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ package com.rtbishop.look4sat.data.usecase
|
|||||||
import android.content.ActivityNotFoundException
|
import android.content.ActivityNotFoundException
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
|
||||||
import com.rtbishop.look4sat.domain.usecase.IOpenWebUrl
|
import com.rtbishop.look4sat.domain.usecase.IOpenWebUrl
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
|
||||||
class OpenWebUrl(private val context: Context) : IOpenWebUrl {
|
class OpenWebUrl(private val context: Context) : IOpenWebUrl {
|
||||||
override fun invoke(url: String) {
|
override fun invoke(url: String) {
|
||||||
try {
|
try {
|
||||||
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
|
context.startActivity(Intent(Intent.ACTION_VIEW, url.toUri()).apply {
|
||||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
})
|
})
|
||||||
} catch (_: ActivityNotFoundException) {
|
} catch (_: ActivityNotFoundException) {
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ class DeepSpaceObject(data: OrbitalData) : OrbitalObject(data) {
|
|||||||
dsv.t = tSince
|
dsv.t = tSince
|
||||||
deep.dpsec(data)
|
deep.dpsec(data)
|
||||||
val a = (XKE / dsv.xn).pow(TWO_THIRDS) * tempa * tempa
|
val a = (XKE / dsv.xn).pow(TWO_THIRDS) * tempa * tempa
|
||||||
dsv.em = dsv.em - tempe
|
dsv.em -= tempe
|
||||||
deep.dpper()
|
deep.dpper()
|
||||||
val xl = dsv.xll + dsv.omgadf + dsv.xnode
|
val xl = dsv.xll + dsv.omgadf + dsv.xnode
|
||||||
val beta = sqrt(1.0 - dsv.em * dsv.em)
|
val beta = sqrt(1.0 - dsv.em * dsv.em)
|
||||||
@@ -606,37 +606,37 @@ class DeepSpaceObject(data: OrbitalData) : OrbitalObject(data) {
|
|||||||
}
|
}
|
||||||
pgh = sghs + sghl
|
pgh = sghs + sghl
|
||||||
ph = shs + sh1
|
ph = shs + sh1
|
||||||
dsv.xinc = dsv.xinc + pinc
|
dsv.xinc += pinc
|
||||||
dsv.em = dsv.em + pe
|
dsv.em += pe
|
||||||
if (xqncl >= 0.2) {
|
if (xqncl >= 0.2) {
|
||||||
/* Apply periodics directly */
|
/* Apply periodics directly */
|
||||||
ph /= dsv.sinio
|
ph /= dsv.sinio
|
||||||
pgh -= dsv.cosio * ph
|
pgh -= dsv.cosio * ph
|
||||||
dsv.omgadf = dsv.omgadf + pgh
|
dsv.omgadf += pgh
|
||||||
dsv.xnode = dsv.xnode + ph
|
dsv.xnode += ph
|
||||||
dsv.xll = dsv.xll + pl
|
dsv.xll += pl
|
||||||
} else {
|
} else {
|
||||||
applyPeriodics()
|
applyPeriodics()
|
||||||
// This is a patch to Lyddane modification suggested by Rob Matson
|
// This is a patch to Lyddane modification suggested by Rob Matson
|
||||||
if (abs(xnoh - dsv.xnode) > PI) {
|
if (abs(xnoh - dsv.xnode) > PI) {
|
||||||
if (dsv.xnode < xnoh) dsv.xnode += TWO_PI else dsv.xnode -= TWO_PI
|
if (dsv.xnode < xnoh) dsv.xnode += TWO_PI else dsv.xnode -= TWO_PI
|
||||||
}
|
}
|
||||||
dsv.xll = dsv.xll + pl
|
dsv.xll += pl
|
||||||
dsv.omgadf = xls - dsv.xll - cos(dsv.xinc) * dsv.xnode
|
dsv.omgadf = xls - dsv.xll - cos(dsv.xinc) * dsv.xnode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Entrance for deep space secular effects
|
// Entrance for deep space secular effects
|
||||||
fun dpsec(params: OrbitalData) {
|
fun dpsec(params: OrbitalData) {
|
||||||
dsv.xll = dsv.xll + ssl * dsv.t
|
dsv.xll += ssl * dsv.t
|
||||||
dsv.omgadf = dsv.omgadf + ssg * dsv.t
|
dsv.omgadf += ssg * dsv.t
|
||||||
dsv.xnode = dsv.xnode + ssh * dsv.t
|
dsv.xnode += ssh * dsv.t
|
||||||
dsv.em = params.eccn + sse * dsv.t
|
dsv.em = params.eccn + sse * dsv.t
|
||||||
dsv.xinc = params.xincl + ssi * dsv.t
|
dsv.xinc = params.xincl + ssi * dsv.t
|
||||||
if (dsv.xinc < 0) {
|
if (dsv.xinc < 0) {
|
||||||
dsv.xinc = -dsv.xinc
|
dsv.xinc = -dsv.xinc
|
||||||
dsv.xnode = dsv.xnode + PI
|
dsv.xnode += PI
|
||||||
dsv.omgadf = dsv.omgadf - PI
|
dsv.omgadf -= PI
|
||||||
}
|
}
|
||||||
if (!resonance) return
|
if (!resonance) return
|
||||||
do processEpochRestartLoop() while (doLoop && epochRestart)
|
do processEpochRestartLoop() while (doLoop && epochRestart)
|
||||||
@@ -788,10 +788,10 @@ class DeepSpaceObject(data: OrbitalData) : OrbitalObject(data) {
|
|||||||
doLoop = doLoop or epochRestart
|
doLoop = doLoop or epochRestart
|
||||||
}
|
}
|
||||||
if (synchronous) {
|
if (synchronous) {
|
||||||
xndot = del1 * sin(xli - fasx2) + del2 * sin(2.0 * (xli - fasx4))
|
xndot = del1 * sin(xli - fasx2) + del2 * sin(2.0 * (xli - fasx4)) +
|
||||||
+del3 * sin(3.0 * (xli - fasx6))
|
del3 * sin(3.0 * (xli - fasx6))
|
||||||
xnddt = del1 * cos(xli - fasx2) + 2 * del2 * cos(2.0 * (xli - fasx4))
|
xnddt = del1 * cos(xli - fasx2) + 2 * del2 * cos(2.0 * (xli - fasx4)) +
|
||||||
+3.0 * del3 * cos(3.0 * (xli - fasx6))
|
3.0 * del3 * cos(3.0 * (xli - fasx6))
|
||||||
} else {
|
} else {
|
||||||
xomi = omegaq + dsv.omgdot * atime
|
xomi = omegaq + dsv.omgdot * atime
|
||||||
x2omi = xomi + xomi
|
x2omi = xomi + xomi
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.rtbishop.look4sat.domain.source
|
package com.rtbishop.look4sat.domain.source
|
||||||
|
|
||||||
object Sources {
|
object Sources {
|
||||||
const val radioDataUrl = "https://db.satnogs.org/api/transmitters/?format=json&status=active"
|
const val RADIO_DATA_URL = "https://db.satnogs.org/api/transmitters/?format=json&status=active"
|
||||||
val satelliteDataUrls = mapOf(
|
val satelliteDataUrls = mapOf(
|
||||||
"All" to "https://celestrak.org/NORAD/elements/gp.php?GROUP=active&FORMAT=csv",
|
"All" to "https://celestrak.org/NORAD/elements/gp.php?GROUP=active&FORMAT=csv",
|
||||||
"Amsat" to "https://amsat.org/tle/current/nasabare.txt",
|
"Amsat" to "https://amsat.org/tle/current/nasabare.txt",
|
||||||
|
|||||||
+12
-12
@@ -1,24 +1,24 @@
|
|||||||
[versions]
|
[versions]
|
||||||
android-gradle-plugin = "8.8.1"
|
android-gradle-plugin = "8.10.1"
|
||||||
google-ksp = "2.1.10-1.0.30"
|
google-ksp = "2.1.21-2.0.2"
|
||||||
kotlin = "2.1.10"
|
kotlin = "2.1.21"
|
||||||
|
|
||||||
androidx-core-ktx = "1.15.0"
|
androidx-core-ktx = "1.16.0"
|
||||||
androidx-core-splashscreen = "1.0.1"
|
androidx-core-splashscreen = "1.0.1"
|
||||||
androidx-room = "2.6.1"
|
androidx-room = "2.7.1"
|
||||||
|
|
||||||
compose-bom = "2025.02.00"
|
compose-bom = "2025.06.00"
|
||||||
compose-activity = "1.10.0"
|
compose-activity = "1.10.1"
|
||||||
compose-lifecycle = "2.8.7"
|
compose-lifecycle = "2.9.1"
|
||||||
compose-navigation = "2.8.7"
|
compose-navigation = "2.9.0"
|
||||||
|
|
||||||
other-coroutines = "1.10.1"
|
other-coroutines = "1.10.2"
|
||||||
other-json = "20240303"
|
other-json = "20250517"
|
||||||
other-okhttp = "4.12.0"
|
other-okhttp = "4.12.0"
|
||||||
other-osmdroid = "6.1.20"
|
other-osmdroid = "6.1.20"
|
||||||
|
|
||||||
test-junit4 = "4.13.2"
|
test-junit4 = "4.13.2"
|
||||||
test-mockk = "1.13.14"
|
test-mockk = "1.14.2"
|
||||||
|
|
||||||
androidTest-junit = "1.2.1"
|
androidTest-junit = "1.2.1"
|
||||||
androidTest-espresso = "3.6.1"
|
androidTest-espresso = "3.6.1"
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
#Sat Jan 04 21:11:19 GMT 2025
|
#Sat Jan 04 21:11:19 GMT 2025
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
Reference in new issue
Block a user