diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt index 26cdb345..c305c13d 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt @@ -17,6 +17,7 @@ import com.google.android.gms.location.LocationServices import com.rtbishop.lookingsat.repo.Repository import com.rtbishop.lookingsat.repo.SatPass import com.rtbishop.lookingsat.repo.SatPassPrefs +import com.rtbishop.lookingsat.repo.Transmitter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -150,6 +151,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } } } + + suspend fun getTransmittersForSat(id: Int): List { + return repository.getTransmittersForSat(id) + } } fun SharedPreferences.Editor.putDouble(key: String, double: Double) diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt index fdf41fdf..f4b20590 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt @@ -9,10 +9,15 @@ import android.view.ViewGroup import android.widget.FrameLayout import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.github.amsacode.predict4java.SatPos +import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.repo.SatPass +import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.Executors @@ -25,14 +30,22 @@ class RadarFragment : Fragment() { private val delay = 5000L private val service = Executors.newSingleThreadScheduledExecutor() + private lateinit var viewModel: MainViewModel private lateinit var satPass: SatPass private lateinit var radarView: RadarView private lateinit var radarSkyFrame: FrameLayout - private lateinit var radarRecycler: RecyclerView + private lateinit var transRecycler: RecyclerView + private lateinit var transAdapter: TransAdapter private lateinit var radarSatName: TextView private lateinit var radarMaxEl: TextView private lateinit var radarAos: TextView private lateinit var radarLos: TextView + private lateinit var transNoFound: TextView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + } override fun onCreateView( inflater: LayoutInflater, @@ -46,13 +59,36 @@ class RadarFragment : Fragment() { super.onViewCreated(view, savedInstanceState) satPass = arguments?.get("satPass") as SatPass radarSkyFrame = view.findViewById(R.id.radar_sky_frame) - radarRecycler = view.findViewById(R.id.radar_recycler) - + transRecycler = view.findViewById(R.id.radar_recycler) radarSatName = view.findViewById(R.id.radar_sat_name) radarMaxEl = view.findViewById(R.id.radar_maxEl) radarAos = view.findViewById(R.id.radar_aos) radarLos = view.findViewById(R.id.radar_los) + transNoFound = view.findViewById(R.id.radar_trans_no_found) + setupRadarView() + setupTransRecycler() + } + + private fun setupTransRecycler() { + transAdapter = TransAdapter() + transRecycler.apply { + layoutManager = LinearLayoutManager(activity as MainActivity) + adapter = transAdapter + } + lifecycleScope.launch { + val transList = viewModel.getTransmittersForSat(satPass.tle.catnum) + if (transList.isNotEmpty()) { + transAdapter.setList(transList) + transAdapter.notifyDataSetChanged() + } else { + transRecycler.visibility = View.INVISIBLE + transNoFound.visibility = View.VISIBLE + } + } + } + + private fun setupRadarView() { radarView = RadarView(activity as MainActivity) radarSkyFrame.addView(radarView) diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt index b8f9e3ba..26a361a4 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt @@ -12,7 +12,9 @@ import com.rtbishop.lookingsat.repo.SatPass import java.text.SimpleDateFormat import java.util.* -class SatPassAdapter : RecyclerView.Adapter() { +class SatPassAdapter : RecyclerView.Adapter() { + + inner class PassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) private var satPassList = emptyList() @@ -24,14 +26,14 @@ class SatPassAdapter : RecyclerView.Adapter() { return satPassList.size } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PassHolder { val itemView = LayoutInflater .from(parent.context) .inflate(R.layout.sat_pass_card, parent, false) - return ViewHolder(itemView) + return PassHolder(itemView) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { + override fun onBindViewHolder(holder: PassHolder, position: Int) { val satPass = satPassList[position] val satName = holder.itemView.findViewById(R.id.card_sat_name) @@ -56,6 +58,4 @@ class SatPassAdapter : RecyclerView.Adapter() { holder.itemView.findNavController().navigate(R.id.action_nav_sky_to_nav_radar, bundle) } } - - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/TransAdapter.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/TransAdapter.kt new file mode 100644 index 00000000..fc7da171 --- /dev/null +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/TransAdapter.kt @@ -0,0 +1,95 @@ +package com.rtbishop.lookingsat.ui + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.rtbishop.lookingsat.R +import com.rtbishop.lookingsat.repo.Transmitter + +class TransAdapter : RecyclerView.Adapter() { + + inner class TransHolder(itemView: View) : RecyclerView.ViewHolder(itemView) + + private var transList = emptyList() + + fun setList(list: List) { + transList = list + } + + override fun getItemCount(): Int { + return transList.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransHolder { + val itemView = LayoutInflater + .from(parent.context) + .inflate(R.layout.card_transmitter, parent, false) + return TransHolder(itemView) + } + + override fun onBindViewHolder(holder: TransHolder, position: Int) { + val context = holder.itemView.context + val freqDivider = 1000000f + val transmitter = transList[position] + val description = holder.itemView.findViewById(R.id.trans_description) + val downlink = holder.itemView.findViewById(R.id.trans_downlink) + val uplink = holder.itemView.findViewById(R.id.trans_uplink) + val mode = holder.itemView.findViewById(R.id.trans_mode) + val inverted = holder.itemView.findViewById(R.id.trans_inverted) + + description.text = transmitter.description + + if (transmitter.downlinkLow != null && transmitter.downlinkHigh == null) { + downlink.text = String.format( + context.getString(R.string.pattern_trans_downlink_low), + transmitter.downlinkLow / freqDivider + ) + } else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) { + downlink.text = String.format( + context.getString(R.string.pattern_trans_downlink_lowHigh), + transmitter.downlinkLow / freqDivider, + transmitter.downlinkHigh / freqDivider + ) + } else { + downlink.text = context.getString(R.string.no_downlink) + } + + if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) { + uplink.text = String.format( + context.getString(R.string.pattern_trans_uplink_low), + transmitter.uplinkLow / freqDivider + ) + } else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) { + uplink.text = String.format( + context.getString(R.string.pattern_trans_uplink_lowHigh), + transmitter.uplinkLow / freqDivider, + transmitter.uplinkHigh / freqDivider + ) + } else { + uplink.text = context.getString(R.string.no_uplink) + } + + if (transmitter.mode != null) { + mode.text = + String.format( + context.getString(R.string.pattern_trans_mode), + transmitter.mode + ) + } else { + mode.text = context.getString(R.string.no_mode) + } + if (transmitter.isInverted) { + inverted.text = String.format( + context.getString(R.string.pattern_trans_inverted), + context.getString(R.string.yes) + ) + } else { + inverted.text = String.format( + context.getString(R.string.pattern_trans_inverted), + context.getString(R.string.no) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/card_transmitter.xml b/app/src/main/res/layout/card_transmitter.xml new file mode 100644 index 00000000..c999ed49 --- /dev/null +++ b/app/src/main/res/layout/card_transmitter.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_radar.xml b/app/src/main/res/layout/fragment_radar.xml index 1322bcde..f0444823 100644 --- a/app/src/main/res/layout/fragment_radar.xml +++ b/app/src/main/res/layout/fragment_radar.xml @@ -17,29 +17,16 @@ - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sat_pass_card.xml b/app/src/main/res/layout/sat_pass_card.xml index b215bd5e..2c89e693 100644 --- a/app/src/main/res/layout/sat_pass_card.xml +++ b/app/src/main/res/layout/sat_pass_card.xml @@ -3,11 +3,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" style="@style/CardSatPass" - android:layout_height="104dp" android:layout_marginStart="4dp" android:layout_marginTop="4dp" android:layout_marginEnd="4dp" - app:cardElevation="8dp"> + app:cardElevation="4dp"> @@ -40,12 +39,12 @@ android:id="@+id/card_pass_vector" style="@style/CardSatPass.SideText" android:layout_width="0dp" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" + android:layout_marginStart="4dp" + android:layout_marginBottom="4dp" android:text="@string/card_pass_vector" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/card_max_el" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/card_max_el" /> + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@+id/imageView" /> + app:layout_constraintBottom_toBottomOf="@+id/imageView" + app:layout_constraintEnd_toEndOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd6c1b5d..2c12f9a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,7 +39,29 @@ Show passes with max elevation above Max elevation + No + Yes + + Mode: Null + Uplink: Null + Downlink: Null + No transmitters found for this Satellite + + ARGOS-3 A-DCS 465.9875MHz + Downlink: 465.9875 MHz + Uplink: 465.9875 MHz + Mode: BPSK400 + Inverted: Yes + Transmitters: + AOS -%02d:%02d:%02d + Mode: %s + Inverted: %s + Uplink: %.4f MHz + Uplink: %.4f - %.4f MHz + Downlink: %.4f MHz + Downlink: %.4f - %.4f MHz + Nasa Map Placeholder diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 93ae1107..8ad72592 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -85,4 +85,16 @@ bold + + + +