diff --git a/app/build.gradle b/app/build.gradle index a9ee5bce..0aedbf82 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,10 +28,10 @@ android { buildToolsVersion "29.0.2" defaultConfig { applicationId "com.rtbishop.look4sat" - minSdkVersion 24 + minSdkVersion 21 targetSdkVersion 29 - versionCode 2 - versionName '1.1' + versionCode 3 + versionName '1.2' } buildTypes { release { diff --git a/app/src/main/java/com/rtbishop/look4sat/predict4kotlin/PassPredictor.kt b/app/src/main/java/com/rtbishop/look4sat/predict4kotlin/PassPredictor.kt index 3d107d3e..2a166cc7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/predict4kotlin/PassPredictor.kt +++ b/app/src/main/java/com/rtbishop/look4sat/predict4kotlin/PassPredictor.kt @@ -103,18 +103,49 @@ class PassPredictor(private val tle: TLE, private val qth: GroundStationPosition var lastAOS: Date var count = 0 - do { - if (count > 0) windBackTime = false - val pass = nextSatPass(trackStartDate, windBackTime) - lastAOS = pass.startTime - passes.add(pass) - trackStartDate = Date(pass.endTime.time + threeQuarterOrbitMinutes() * 60L * 1000L) - count++ - } while (lastAOS < trackEndDate) + if (tle.isDeepspace) { + passes.add(nextGeoSatPass(start)) + } else { + do { + if (count > 0) windBackTime = false + val pass = nextSatPass(trackStartDate, windBackTime) + lastAOS = pass.startTime + passes.add(pass) + trackStartDate = Date(pass.endTime.time + threeQuarterOrbitMinutes() * 60L * 1000L) + count++ + } while (lastAOS < trackEndDate) + } return passes } + private fun nextGeoSatPass(date: Date): SatPassTime { + val aosAzimuth: Int + val losAzimuth: Int + val tca: Date + val polePassed: String + val cal = Calendar.getInstance(timeZone).apply { + clear() + timeInMillis = date.time + } + val satPos = getSatPos(cal.time) + + aosAzimuth = (satPos.azimuth / (2.0 * Math.PI) * 360.0).toInt() + losAzimuth = (satPos.azimuth / (2.0 * Math.PI) * 360.0).toInt() + tca = satPos.time + polePassed = getPolePassed(satPos, satPos) + + cal.add(Calendar.HOUR, -12) + val startDate = cal.time + cal.add(Calendar.HOUR, 24) + val endDate = cal.time + + return SatPassTime( + startDate, endDate, tca, polePassed, aosAzimuth, + losAzimuth, satPos.elevation / (2.0 * Math.PI) * 360.0 + ) + } + private fun nextSatPass(date: Date, windBack: Boolean = false): SatPassTime { val aosAzimuth: Int val losAzimuth: Int diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt index 5dd36422..156d9253 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt @@ -187,14 +187,4 @@ class MainActivity : AppCompatActivity() { val navController = findNavController(R.id.nav_host) return navController.navigateUp(appBarConfig) || super.onSupportNavigateUp() } -// -// private fun ImageButton.enable() { -// this.isEnabled = true -// this.alpha = 1.0f -// } -// -// private fun ImageButton.disable() { -// this.isEnabled = false -// this.alpha = 0.25f -// } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt index 7a8eacc5..97aa860d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt @@ -29,6 +29,7 @@ import android.widget.FrameLayout import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.github.amsacode.predict4java.GroundStationPosition @@ -146,19 +147,19 @@ class MapViewFragment : Fragment() { private val scale = resources.displayMetrics.density private val groundTrackPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satTrack, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.satTrack) style = Paint.Style.STROKE strokeWidth = scale } private val footprintPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satFootprint, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.satFootprint) style = Paint.Style.STROKE strokeWidth = scale } private val txtPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satFootprint, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.satFootprint) style = Paint.Style.FILL strokeWidth = scale textSize = 16f diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt index da79e6aa..57045508 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt @@ -245,7 +245,7 @@ class PassListFragment : Fragment() { override fun onTick(millisUntilFinished: Long) { aosTimerText.text = String.format( - mainActivity.getString(R.string.pat_timer_aos), + mainActivity.getString(R.string.pat_timer), TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60 @@ -265,7 +265,7 @@ class PassListFragment : Fragment() { override fun onTick(millisUntilFinished: Long) { aosTimerText.text = String.format( - mainActivity.getString(R.string.pat_timer_los), + mainActivity.getString(R.string.pat_timer), TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60 @@ -281,6 +281,6 @@ class PassListFragment : Fragment() { isTimerSet = false } if (resetToNull) aosTimerText.text = - String.format(getString(R.string.pat_timer_aos), 0, 0, 0) + String.format(getString(R.string.pat_timer), 0, 0, 0) } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt index 013e4667..ff27c774 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt @@ -29,6 +29,7 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -132,24 +133,24 @@ class PolarViewFragment : Fragment() { private val radarPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.themeLight, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.themeLight) style = Paint.Style.STROKE strokeWidth = scale } private val txtPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.themeAccent, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.themeAccent) textSize = txtSize } private val trackPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satTrack, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.satTrack) style = Paint.Style.STROKE strokeWidth = scale } private val satPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.themeAccent, mainActivity.theme) + color = ContextCompat.getColor(mainActivity, R.color.themeAccent) style = Paint.Style.FILL } private val path: Path = Path() @@ -163,7 +164,7 @@ class PolarViewFragment : Fragment() { setPassText() drawRadarView(canvas) drawRadarText(canvas) - drawPassTrajectory(canvas) + if (!satPass.tle.isDeepspace) drawPassTrajectory(canvas) drawSatellite(canvas) } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt index 393945f5..2fadcb30 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt @@ -34,7 +34,7 @@ import com.rtbishop.look4sat.ui.PassListFragmentDirections import java.text.SimpleDateFormat import java.util.* -class SatPassAdapter : RecyclerView.Adapter() { +class SatPassAdapter : RecyclerView.Adapter() { private var satPassList = mutableListOf() @@ -71,15 +71,31 @@ class SatPassAdapter : RecyclerView.Adapter() { return satPassList.size } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatPassHolder { - val itemView = LayoutInflater - .from(parent.context) - .inflate(R.layout.card_pass, parent, false) - return SatPassHolder(itemView) + override fun getItemViewType(position: Int): Int { + return if (satPassList[position].tle.isDeepspace) 1 + else 0 } - override fun onBindViewHolder(holder: SatPassHolder, position: Int) { - holder.bind(satPassList[position]) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == 0) { + val itemView = LayoutInflater + .from(parent.context) + .inflate(R.layout.card_pass, parent, false) + return SatPassHolder(itemView) + } else { + val itemView = LayoutInflater + .from(parent.context) + .inflate(R.layout.card_pass_geo, parent, false) + SatPassGeoHolder(itemView) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType == 0) { + (holder as SatPassHolder).bind(satPassList[position]) + } else { + (holder as SatPassGeoHolder).bind(satPassList[position]) + } } inner class SatPassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -123,4 +139,29 @@ class SatPassAdapter : RecyclerView.Adapter() { } } } + + inner class SatPassGeoHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + private val context: Context = itemView.context + private val satName = itemView.findViewById(R.id.pass_geo_name) + private val satId = itemView.findViewById(R.id.pass_geo_id) + private val satAz = itemView.findViewById(R.id.pass_geo_az) + private val satEl = itemView.findViewById(R.id.pass_geo_el) + + fun bind(satPass: SatPass) { + val satPos = satPass.predictor.getSatPos(satPass.pass.startTime) + val azimuth = satPos.azimuth * 180 / Math.PI + + satName.text = satPass.tle.name + satId.text = String.format(context.getString(R.string.pass_satId), satPass.tle.catnum) + satAz.text = String.format(context.getString(R.string.pat_azimuth), azimuth) + satEl.text = + String.format(context.getString(R.string.pat_elevation), satPass.pass.maxEl) + + itemView.setOnClickListener { + val action = PassListFragmentDirections.actionPassToPolar(satPass) + itemView.findNavController().navigate(action) + } + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-nodpi/splash_foreground.webp b/app/src/main/res/drawable-nodpi/splash_foreground.webp deleted file mode 100644 index 6818eef2..00000000 Binary files a/app/src/main/res/drawable-nodpi/splash_foreground.webp and /dev/null differ diff --git a/app/src/main/res/drawable-nodpi/splash_front.webp b/app/src/main/res/drawable-nodpi/splash_front.webp new file mode 100644 index 00000000..c694aa09 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/splash_front.webp differ diff --git a/app/src/main/res/drawable/splash_drawable.xml b/app/src/main/res/drawable/splash_drawable.xml index bc9c1d75..9b75210f 100644 --- a/app/src/main/res/drawable/splash_drawable.xml +++ b/app/src/main/res/drawable/splash_drawable.xml @@ -2,9 +2,9 @@ - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 7639ba45..aecc38db 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -26,7 +26,7 @@ style="@style/ToolbarText" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginEnd="16dp" + android:layout_marginEnd="24dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/toolbar_filter" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/card_pass.xml b/app/src/main/res/layout/card_pass.xml index 42dd675b..e5b48269 100644 --- a/app/src/main/res/layout/card_pass.xml +++ b/app/src/main/res/layout/card_pass.xml @@ -29,8 +29,19 @@ + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b934ae74..28a7e779 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -90,15 +90,13 @@ Долгота: %.1f° Расст.: %.0f км Высота: %.0f км - НПС -%02d:%02d:%02d - КПС -%02d:%02d:%02d Модуляция: %s Инверсия: %s - Исход. канал: %.4f MHz - Исход. канал: %.4f - %.4f MHz - Вход. канал: %.4f MHz - Вход. канал: %.4f - %.4f MHz + Исходящий: %.4f MHz + Исходящий: %.4f - %.4f MHz + Входящий: %.4f MHz + Входящий: %.4f - %.4f MHz Проведите по экрану вниз, чтобы обновить список пролетов для выбранных спутников diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d0abdbaa..7dec5f27 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,8 +102,7 @@ Longitude: %.1f° Distance: %.0f km Altitude: %.0f km - AOS -%02d:%02d:%02d - LOS -%02d:%02d:%02d + %02d:%02d:%02d %s Mode: %s @@ -125,8 +124,7 @@ Amateur radio and weather satellites passes calculator for Android Big thanks: - — To you for installing and using this app! - \nMay your sky always be clear!\n + — To you for installing and using this app! May your sky always be clear!\n \n— To David A. B. Johnson, G4DPZ, the author of predict4java library which this app is using for all the SGP4 model calculations.\n diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 488f1d41..6db339e5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -70,7 +70,7 @@ wrap_content wrap_content center - 28sp + 36sp bold @color/themeAccent