mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-03 19:27:24 +00:00
Major classes, variables and strings refactoring. Code cleanup.
This commit is contained in:
1 parent
32605496b8
commit
bb25ef8d62
34 files changed
+601
-545
No files matched your search
@@ -48,19 +48,15 @@ import javax.inject.Inject
|
||||
|
||||
class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
private val defValueLoc = application.getString(R.string.def_gsp_loc)
|
||||
private val defValueHours = application.getString(R.string.def_hours_ahead).toInt()
|
||||
private val defValueMinEl = application.getString(R.string.def_min_el).toDouble()
|
||||
private val defValueUpdateFreq = application.getString(R.string.def_update_freq)
|
||||
private val keyHours = application.getString(R.string.key_hours_ahead)
|
||||
private val keyMinEl = application.getString(R.string.key_min_el)
|
||||
private val keyLat = application.getString(R.string.key_lat)
|
||||
private val keyLon = application.getString(R.string.key_lon)
|
||||
private val keyAlt = application.getString(R.string.key_alt)
|
||||
private val keyDelay = application.getString(R.string.key_delay)
|
||||
private val tleMainListFileName = application.getString(R.string.tle_main_list_file_name)
|
||||
private val tleSelectionFileName = application.getString(R.string.tle_selection_file_name)
|
||||
private val app = application
|
||||
private val keyHours = application.getString(R.string.pref_hours_ahead_key)
|
||||
private val keyMinEl = application.getString(R.string.pref_min_el_key)
|
||||
private val keyLat = application.getString(R.string.pref_lat_key)
|
||||
private val keyLon = application.getString(R.string.pref_lon_key)
|
||||
private val keyAlt = application.getString(R.string.pref_alt_key)
|
||||
private val keyDelay = application.getString(R.string.pref_refresh_rate_key)
|
||||
private val tleMainListFileName = "tleFile.txt"
|
||||
private val tleSelectionFileName = "tleSelection"
|
||||
|
||||
private val _debugMessage = MutableLiveData<String>()
|
||||
val debugMessage: LiveData<String> = _debugMessage
|
||||
@@ -93,18 +89,18 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
}
|
||||
|
||||
val delay: Long
|
||||
get() = preferences.getString(keyDelay, defValueUpdateFreq)!!.toLong()
|
||||
get() = preferences.getString(keyDelay, "3000")!!.toLong()
|
||||
|
||||
val hoursAhead: Int
|
||||
get() = preferences.getInt(keyHours, defValueHours)
|
||||
get() = preferences.getInt(keyHours, 8)
|
||||
|
||||
val minEl: Double
|
||||
get() = preferences.getDouble(keyMinEl, defValueMinEl)
|
||||
get() = preferences.getDouble(keyMinEl, 16.0)
|
||||
|
||||
fun setGroundStationPosition() {
|
||||
val lat = preferences.getString(keyLat, defValueLoc)!!.toDouble()
|
||||
val lon = preferences.getString(keyLon, defValueLoc)!!.toDouble()
|
||||
val alt = preferences.getString(keyAlt, defValueLoc)!!.toDouble()
|
||||
val lat = preferences.getString(keyLat, "0.0")!!.toDouble()
|
||||
val lon = preferences.getString(keyLon, "0.0")!!.toDouble()
|
||||
val alt = preferences.getString(keyAlt, "0.0")!!.toDouble()
|
||||
_gsp.postValue(GroundStationPosition(lat, lon, alt))
|
||||
}
|
||||
|
||||
@@ -193,11 +189,19 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
try {
|
||||
val predictor = PassPredictor(tle, gsp.value)
|
||||
val passes = predictor.getPasses(dateNow, hoursAhead, true)
|
||||
passes.forEach { passList.add(SatPass(tle, predictor, it)) }
|
||||
passes.forEach {
|
||||
passList.add(
|
||||
SatPass(
|
||||
tle,
|
||||
predictor,
|
||||
it
|
||||
)
|
||||
)
|
||||
}
|
||||
} catch (exception: IllegalArgumentException) {
|
||||
_debugMessage.postValue("There was a problem with ${tle.name}")
|
||||
_debugMessage.postValue(app.getString(R.string.error_sat_tle))
|
||||
} catch (exception: SatNotFoundException) {
|
||||
_debugMessage.postValue("${tle.name} shall not pass")
|
||||
_debugMessage.postValue(app.getString(R.string.error_sat_wont_pass))
|
||||
}
|
||||
}
|
||||
passList.removeAll { it.pass.startTime.after(dateFuture) }
|
||||
@@ -220,7 +224,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
val tleList = ObjectInputStream(tleStream).readObject()
|
||||
tleList as List<TLE>
|
||||
} catch (exception: FileNotFoundException) {
|
||||
_debugMessage.postValue("TLE file wasn't found")
|
||||
_debugMessage.postValue(app.getString(R.string.no_tle_found))
|
||||
emptyList()
|
||||
} catch (exception: IOException) {
|
||||
_debugMessage.postValue(exception.toString())
|
||||
@@ -231,7 +235,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
|
||||
val selectionList = ObjectInputStream(selectionStream).readObject()
|
||||
selectionList as MutableList<Int>
|
||||
} catch (exception: FileNotFoundException) {
|
||||
_debugMessage.postValue("Selection file wasn't found")
|
||||
_debugMessage.postValue(app.getString(R.string.no_selection_found))
|
||||
mutableListOf()
|
||||
} catch (exception: IOException) {
|
||||
_debugMessage.postValue(exception.toString())
|
||||
|
||||
@@ -82,7 +82,7 @@ class MainActivity : AppCompatActivity() {
|
||||
val toolbar: Toolbar = findViewById(R.id.toolbar)
|
||||
setSupportActionBar(toolbar)
|
||||
|
||||
timerLayout = findViewById(R.id.toolbar_layout_timer)
|
||||
timerLayout = findViewById(R.id.toolbar_layout)
|
||||
drawerLayout = findViewById(R.id.drawer_layout)
|
||||
drawerLat = header.findViewById(R.id.drawer_lat_value)
|
||||
drawerLon = header.findViewById(R.id.drawer_lon_value)
|
||||
@@ -93,7 +93,7 @@ class MainActivity : AppCompatActivity() {
|
||||
drawerBtnExit = header.findViewById(R.id.drawer_btn_exit)
|
||||
|
||||
appBarConfig = AppBarConfiguration(
|
||||
setOf(R.id.nav_sky, R.id.nav_map, R.id.nav_credits, R.id.nav_about),
|
||||
setOf(R.id.nav_pass_list, R.id.nav_map_view, R.id.nav_credits, R.id.nav_about),
|
||||
drawerLayout
|
||||
)
|
||||
|
||||
@@ -102,12 +102,12 @@ class MainActivity : AppCompatActivity() {
|
||||
|
||||
navController.addOnDestinationChangedListener { _, destination, _ ->
|
||||
when (destination.id) {
|
||||
R.id.nav_sky -> {
|
||||
R.id.nav_pass_list -> {
|
||||
this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
||||
toolbar.visibility = View.VISIBLE
|
||||
timerLayout.visibility = View.VISIBLE
|
||||
}
|
||||
R.id.nav_map -> {
|
||||
R.id.nav_map_view -> {
|
||||
this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
||||
toolbar.visibility = View.GONE
|
||||
}
|
||||
@@ -131,8 +131,8 @@ class MainActivity : AppCompatActivity() {
|
||||
})
|
||||
|
||||
viewModel.gsp.observe(this, Observer { gsp ->
|
||||
drawerLat.text = String.format(getString(R.string.pattern_location), gsp.latitude)
|
||||
drawerLon.text = String.format(getString(R.string.pattern_location), gsp.longitude)
|
||||
drawerLat.text = String.format(getString(R.string.pattern_loc), gsp.latitude)
|
||||
drawerLon.text = String.format(getString(R.string.pattern_loc), gsp.longitude)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -41,14 +41,14 @@ import java.util.concurrent.ScheduledExecutorService
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlin.math.abs
|
||||
|
||||
class WorldMapFragment : Fragment() {
|
||||
class MapViewFragment : Fragment() {
|
||||
|
||||
private lateinit var service: ScheduledExecutorService
|
||||
private lateinit var mainActivity: MainActivity
|
||||
private lateinit var viewModel: MainViewModel
|
||||
private lateinit var mapFrame: FrameLayout
|
||||
private lateinit var fab: FloatingActionButton
|
||||
private lateinit var trackView: TrackView
|
||||
private lateinit var mapFab: FloatingActionButton
|
||||
private lateinit var mapView: MapView
|
||||
private lateinit var predictor: PassPredictor
|
||||
private lateinit var selectedSat: TLE
|
||||
private lateinit var gsp: GroundStationPosition
|
||||
@@ -67,7 +67,7 @@ class WorldMapFragment : Fragment() {
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.fragment_worldmap, container, false)
|
||||
return inflater.inflate(R.layout.fragment_map_view, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
@@ -77,8 +77,8 @@ class WorldMapFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun findViews(view: View) {
|
||||
mapFrame = view.findViewById(R.id.worldmap_frame)
|
||||
fab = view.findViewById(R.id.worldmap_fab)
|
||||
mapFrame = view.findViewById(R.id.map_frame)
|
||||
mapFab = view.findViewById(R.id.map_fab)
|
||||
}
|
||||
|
||||
private fun setupComponents() {
|
||||
@@ -89,19 +89,19 @@ class WorldMapFragment : Fragment() {
|
||||
if (satPassList.isNotEmpty()) {
|
||||
satPassList = satPassList.distinctBy { it.tle }
|
||||
satPassList = satPassList.sortedBy { it.tle.name }
|
||||
fab.setOnClickListener { showSelectSatDialog(satPassList) }
|
||||
mapFab.setOnClickListener { showSelectSatDialog(satPassList) }
|
||||
selectedSat = satPassList.first().tle
|
||||
predictor = satPassList.first().predictor
|
||||
trackView = TrackView(mainActivity)
|
||||
mapFrame.addView(trackView)
|
||||
mapView = MapView(mainActivity)
|
||||
mapFrame.addView(mapView)
|
||||
service.scheduleAtFixedRate(
|
||||
{ trackView.invalidate() },
|
||||
{ mapView.invalidate() },
|
||||
delay,
|
||||
delay,
|
||||
TimeUnit.MILLISECONDS
|
||||
)
|
||||
} else {
|
||||
fab.setOnClickListener {
|
||||
mapFab.setOnClickListener {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.no_selected_sat),
|
||||
@@ -124,14 +124,14 @@ class WorldMapFragment : Fragment() {
|
||||
checkedItem = which
|
||||
selectedSat = list[which].tle
|
||||
predictor = list[which].predictor
|
||||
trackView.invalidate()
|
||||
mapView.invalidate()
|
||||
dialog.dismiss()
|
||||
}
|
||||
.create()
|
||||
.show()
|
||||
}
|
||||
|
||||
inner class TrackView(context: Context) : View(context) {
|
||||
inner class MapView(context: Context) : View(context) {
|
||||
private val scale = resources.displayMetrics.density
|
||||
private val groundTrackPaint = Paint().apply {
|
||||
isAntiAlias = true
|
||||
+39
-34
@@ -41,18 +41,19 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import com.rtbishop.look4sat.MainViewModel
|
||||
import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.SatPass
|
||||
import com.rtbishop.look4sat.ui.adapters.SatPassAdapter
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class SkyFragment : Fragment() {
|
||||
class PassListFragment : Fragment() {
|
||||
|
||||
private lateinit var viewModel: MainViewModel
|
||||
private lateinit var recyclerPasses: RecyclerView
|
||||
private lateinit var recyclerAdapter: SatPassAdapter
|
||||
private lateinit var timeToAos: TextView
|
||||
private lateinit var satPassRecycler: RecyclerView
|
||||
private lateinit var satPassAdapter: SatPassAdapter
|
||||
private lateinit var btnPassPrefs: ImageButton
|
||||
private lateinit var fab: FloatingActionButton
|
||||
private lateinit var passListFab: FloatingActionButton
|
||||
private lateinit var aosTimer: CountDownTimer
|
||||
private lateinit var aosTimerText: TextView
|
||||
private lateinit var swipeLayout: SwipeRefreshLayout
|
||||
private lateinit var mainActivity: MainActivity
|
||||
private lateinit var satPassList: MutableList<SatPass>
|
||||
@@ -62,14 +63,16 @@ class SkyFragment : Fragment() {
|
||||
super.onCreate(savedInstanceState)
|
||||
mainActivity = activity as MainActivity
|
||||
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
|
||||
recyclerAdapter = SatPassAdapter()
|
||||
satPassAdapter = SatPassAdapter()
|
||||
satPassList = mutableListOf()
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.fragment_sky, container, false)
|
||||
return inflater.inflate(R.layout.fragment_pass_list, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
@@ -80,29 +83,29 @@ class SkyFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun findViews(view: View) {
|
||||
timeToAos = (mainActivity).findViewById(R.id.toolbar_time_to_aos)
|
||||
btnPassPrefs = (mainActivity).findViewById(R.id.toolbar_btn_refresh)
|
||||
swipeLayout = view.findViewById(R.id.swipeRefreshLayout)
|
||||
recyclerPasses = view.findViewById(R.id.sky_recycler_future)
|
||||
fab = view.findViewById(R.id.sky_fab)
|
||||
aosTimerText = (mainActivity).findViewById(R.id.toolbar_timer)
|
||||
btnPassPrefs = (mainActivity).findViewById(R.id.toolbar_filter)
|
||||
swipeLayout = view.findViewById(R.id.pass_list_refresh)
|
||||
satPassRecycler = view.findViewById(R.id.pass_list_recycler)
|
||||
passListFab = view.findViewById(R.id.pass_list_fab)
|
||||
}
|
||||
|
||||
private fun setupComponents() {
|
||||
recyclerPasses.apply {
|
||||
satPassRecycler.apply {
|
||||
layoutManager = LinearLayoutManager(mainActivity)
|
||||
adapter = recyclerAdapter
|
||||
adapter = satPassAdapter
|
||||
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
||||
}
|
||||
recyclerAdapter.setList(satPassList)
|
||||
satPassAdapter.setList(satPassList)
|
||||
setTimer()
|
||||
|
||||
swipeLayout.setProgressBackgroundColorSchemeResource(R.color.themeAccent)
|
||||
swipeLayout.setColorSchemeResources(R.color.darkOnLight)
|
||||
swipeLayout.setColorSchemeResources(R.color.backgroundDark)
|
||||
swipeLayout.setOnRefreshListener { calculatePasses() }
|
||||
btnPassPrefs.setOnClickListener {
|
||||
showSatPassPrefsDialog(viewModel.hoursAhead, viewModel.minEl)
|
||||
}
|
||||
fab.setOnClickListener {
|
||||
passListFab.setOnClickListener {
|
||||
showSelectSatDialog(viewModel.tleMainList, viewModel.tleSelection)
|
||||
}
|
||||
}
|
||||
@@ -110,7 +113,7 @@ class SkyFragment : Fragment() {
|
||||
private fun setupObservers() {
|
||||
viewModel.passSatList.observe(viewLifecycleOwner, Observer {
|
||||
satPassList = it
|
||||
recyclerAdapter.setList(satPassList)
|
||||
satPassAdapter.setList(satPassList)
|
||||
setTimer()
|
||||
swipeLayout.isRefreshing = false
|
||||
})
|
||||
@@ -122,14 +125,14 @@ class SkyFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun showSatPassPrefsDialog(hoursAhead: Int, minEl: Double) {
|
||||
val satPassPrefView = View.inflate(mainActivity, R.layout.sat_pass_pref, null)
|
||||
val etHoursAhead = satPassPrefView.findViewById<EditText>(R.id.pref_hours_ahead_et)
|
||||
val etMinEl = satPassPrefView.findViewById<EditText>(R.id.pref_min_el_et)
|
||||
val satPassPrefView = View.inflate(mainActivity, R.layout.dialog_pass_pref, null)
|
||||
val etHoursAhead = satPassPrefView.findViewById<EditText>(R.id.pref_et_hoursAhead)
|
||||
val etMinEl = satPassPrefView.findViewById<EditText>(R.id.pref_et_minEl)
|
||||
etHoursAhead.setText(hoursAhead.toString())
|
||||
etMinEl.setText(minEl.toString())
|
||||
|
||||
val builder = AlertDialog.Builder(mainActivity)
|
||||
builder.setTitle(getString(R.string.dialog_pass_prefs))
|
||||
builder.setTitle(getString(R.string.dialog_filter_passes))
|
||||
.setPositiveButton(getString(R.string.btn_ok)) { _, _ ->
|
||||
val hoursStr = etHoursAhead.text.toString()
|
||||
val elevationStr = etMinEl.text.toString()
|
||||
@@ -140,14 +143,14 @@ class SkyFragment : Fragment() {
|
||||
hours < 1 || hours > 168 -> {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
"Value should be within 1-168 hours",
|
||||
getString(R.string.pref_hours_ahead_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
elevation < 0 || elevation > 90 -> {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
"Value should be within 0-90 deg",
|
||||
getString(R.string.pref_min_el_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
@@ -158,7 +161,7 @@ class SkyFragment : Fragment() {
|
||||
}
|
||||
} else Toast.makeText(
|
||||
mainActivity,
|
||||
"Please, enter the value",
|
||||
getString(R.string.error_enter_value),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
|
||||
@@ -173,7 +176,8 @@ class SkyFragment : Fragment() {
|
||||
|
||||
private fun showSelectSatDialog(tleMainList: List<TLE>, selectionList: MutableList<Int>) {
|
||||
if (tleMainList.isEmpty()) {
|
||||
Toast.makeText(mainActivity, "Please, update your TLE", Toast.LENGTH_SHORT).show()
|
||||
Toast.makeText(mainActivity, getString(R.string.error_update_tle), Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
} else {
|
||||
val tleNameArray = arrayOfNulls<String>(tleMainList.size).apply {
|
||||
tleMainList.withIndex().forEach { (position, tle) -> this[position] = tle.name }
|
||||
@@ -230,13 +234,13 @@ class SkyFragment : Fragment() {
|
||||
}
|
||||
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
timeToAos.text = String.format(
|
||||
mainActivity.getString(R.string.pattern_aos),
|
||||
aosTimerText.text = String.format(
|
||||
mainActivity.getString(R.string.pattern_timer_aos),
|
||||
TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60,
|
||||
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
|
||||
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60
|
||||
)
|
||||
recyclerAdapter.updateRecycler()
|
||||
satPassAdapter.updateRecycler()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -250,13 +254,13 @@ class SkyFragment : Fragment() {
|
||||
}
|
||||
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
timeToAos.text = String.format(
|
||||
mainActivity.getString(R.string.pattern_los),
|
||||
aosTimerText.text = String.format(
|
||||
mainActivity.getString(R.string.pattern_timer_los),
|
||||
TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60,
|
||||
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
|
||||
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60
|
||||
)
|
||||
recyclerAdapter.updateRecycler()
|
||||
satPassAdapter.updateRecycler()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,6 +270,7 @@ class SkyFragment : Fragment() {
|
||||
aosTimer.cancel()
|
||||
isTimerSet = false
|
||||
}
|
||||
if (resetToNull) timeToAos.text = String.format(getString(R.string.pattern_aos), 0, 0, 0)
|
||||
if (resetToNull) aosTimerText.text =
|
||||
String.format(getString(R.string.pattern_timer_aos), 0, 0, 0)
|
||||
}
|
||||
}
|
||||
+41
-32
@@ -39,6 +39,7 @@ import com.github.amsacode.predict4java.SatPos
|
||||
import com.rtbishop.look4sat.MainViewModel
|
||||
import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.SatPass
|
||||
import com.rtbishop.look4sat.ui.adapters.TransmitterAdapter
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.*
|
||||
import java.util.concurrent.Executors
|
||||
@@ -46,22 +47,22 @@ import java.util.concurrent.TimeUnit
|
||||
import kotlin.math.cos
|
||||
import kotlin.math.sin
|
||||
|
||||
class RadarFragment : Fragment() {
|
||||
class PolarViewFragment : Fragment() {
|
||||
|
||||
private val service = Executors.newSingleThreadScheduledExecutor()
|
||||
private val args: RadarFragmentArgs by navArgs()
|
||||
private val args: PolarViewFragmentArgs by navArgs()
|
||||
|
||||
private lateinit var viewModel: MainViewModel
|
||||
private lateinit var satPass: SatPass
|
||||
private lateinit var radarView: RadarView
|
||||
private lateinit var radarSkyFrame: FrameLayout
|
||||
private lateinit var polarView: PolarView
|
||||
private lateinit var polarViewFrame: FrameLayout
|
||||
private lateinit var transRecycler: RecyclerView
|
||||
private lateinit var transAdapter: TransAdapter
|
||||
private lateinit var radarAzimuth: TextView
|
||||
private lateinit var radarElevation: TextView
|
||||
private lateinit var radarRange: TextView
|
||||
private lateinit var radarAltitude: TextView
|
||||
private lateinit var transNoFound: TextView
|
||||
private lateinit var transmitterAdapter: TransmitterAdapter
|
||||
private lateinit var polarAzimuth: TextView
|
||||
private lateinit var polarElevation: TextView
|
||||
private lateinit var polarRange: TextView
|
||||
private lateinit var polarAltitude: TextView
|
||||
private lateinit var noTransFound: TextView
|
||||
private lateinit var mainActivity: MainActivity
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -75,7 +76,7 @@ class RadarFragment : Fragment() {
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return inflater.inflate(R.layout.fragment_radar, container, false)
|
||||
return inflater.inflate(R.layout.fragment_polar_view, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
@@ -84,40 +85,40 @@ class RadarFragment : Fragment() {
|
||||
satPass = args.satPass
|
||||
mainActivity.supportActionBar?.title = satPass.tle.name
|
||||
|
||||
radarSkyFrame = view.findViewById(R.id.radar_sky_frame)
|
||||
transRecycler = view.findViewById(R.id.radar_recycler)
|
||||
radarAzimuth = view.findViewById(R.id.radar_azimuth)
|
||||
radarElevation = view.findViewById(R.id.radar_elevation)
|
||||
radarRange = view.findViewById(R.id.radar_range)
|
||||
radarAltitude = view.findViewById(R.id.radar_altitude)
|
||||
transNoFound = view.findViewById(R.id.radar_no_trans)
|
||||
polarViewFrame = view.findViewById(R.id.polar_view_frame)
|
||||
transRecycler = view.findViewById(R.id.polar_recycler)
|
||||
polarAzimuth = view.findViewById(R.id.polar_azimuth)
|
||||
polarElevation = view.findViewById(R.id.polar_elevation)
|
||||
polarRange = view.findViewById(R.id.polar_range)
|
||||
polarAltitude = view.findViewById(R.id.polar_altitude)
|
||||
noTransFound = view.findViewById(R.id.polar_no_trans)
|
||||
|
||||
radarView = RadarView(mainActivity, delay)
|
||||
radarSkyFrame.addView(radarView)
|
||||
service.scheduleAtFixedRate({ radarView.invalidate() }, delay, delay, TimeUnit.MILLISECONDS)
|
||||
polarView = PolarView(mainActivity, delay)
|
||||
polarViewFrame.addView(polarView)
|
||||
service.scheduleAtFixedRate({ polarView.invalidate() }, delay, delay, TimeUnit.MILLISECONDS)
|
||||
|
||||
setupTransRecycler()
|
||||
}
|
||||
|
||||
private fun setupTransRecycler() {
|
||||
transAdapter = TransAdapter()
|
||||
transmitterAdapter = TransmitterAdapter()
|
||||
transRecycler.apply {
|
||||
layoutManager = LinearLayoutManager(mainActivity)
|
||||
adapter = transAdapter
|
||||
adapter = transmitterAdapter
|
||||
}
|
||||
lifecycleScope.launch {
|
||||
val transList = viewModel.getTransmittersForSat(satPass.tle.catnum)
|
||||
if (transList.isNotEmpty()) {
|
||||
transAdapter.setList(transList)
|
||||
transAdapter.notifyDataSetChanged()
|
||||
transmitterAdapter.setList(transList)
|
||||
transmitterAdapter.notifyDataSetChanged()
|
||||
} else {
|
||||
transRecycler.visibility = View.INVISIBLE
|
||||
transNoFound.visibility = View.VISIBLE
|
||||
noTransFound.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class RadarView(context: Context, updateFreq: Long) : View(context) {
|
||||
inner class PolarView(context: Context, updateFreq: Long) : View(context) {
|
||||
|
||||
private val radarSize = resources.displayMetrics.widthPixels
|
||||
private val scale = resources.displayMetrics.density
|
||||
@@ -131,7 +132,7 @@ class RadarFragment : Fragment() {
|
||||
|
||||
private val radarPaint = Paint().apply {
|
||||
isAntiAlias = true
|
||||
color = resources.getColor(R.color.lightOnDark, mainActivity.theme)
|
||||
color = resources.getColor(R.color.themeLight, mainActivity.theme)
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = scale
|
||||
}
|
||||
@@ -168,10 +169,18 @@ class RadarFragment : Fragment() {
|
||||
|
||||
private fun setPassText() {
|
||||
satPos = satPass.predictor.getSatPos(Date())
|
||||
radarAzimuth.text = String.format("Azimuth: %.1f°", rad2Deg(satPos.azimuth))
|
||||
radarElevation.text = String.format("Elevation: %.1f°", rad2Deg(satPos.elevation))
|
||||
radarRange.text = String.format("Range: %.0f km", satPos.range)
|
||||
radarAltitude.text = String.format("Altitude: %.0f km", satPos.altitude)
|
||||
polarAzimuth.text = String.format(
|
||||
context.getString(R.string.pattern_polar_azimuth),
|
||||
rad2Deg(satPos.azimuth)
|
||||
)
|
||||
polarElevation.text = String.format(
|
||||
context.getString(R.string.pattern_polar_elev),
|
||||
rad2Deg(satPos.elevation)
|
||||
)
|
||||
polarRange.text =
|
||||
String.format(context.getString(R.string.pattern_polar_range), satPos.range)
|
||||
polarAltitude.text =
|
||||
String.format(context.getString(R.string.pattern_polar_alt), satPos.altitude)
|
||||
}
|
||||
|
||||
private fun drawRadarView(cvs: Canvas) {
|
||||
@@ -34,94 +34,112 @@ class SettingsFragment : PreferenceFragmentCompat(),
|
||||
|
||||
private lateinit var mainActivity: MainActivity
|
||||
private lateinit var viewModel: MainViewModel
|
||||
private lateinit var keyLat: String
|
||||
private lateinit var keyLon: String
|
||||
private lateinit var keyAlt: String
|
||||
private lateinit var keyDelay: String
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.preference, rootKey)
|
||||
val provider = EditTextPreference.SimpleSummaryProvider.getInstance()
|
||||
|
||||
mainActivity = activity as MainActivity
|
||||
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
|
||||
|
||||
val provider = EditTextPreference.SimpleSummaryProvider.getInstance()
|
||||
val latPref = findPreference<EditTextPreference>(context!!.getText(R.string.key_lat))
|
||||
val lonPref = findPreference<EditTextPreference>(context!!.getText(R.string.key_lon))
|
||||
val altPref = findPreference<EditTextPreference>(context!!.getText(R.string.key_alt))
|
||||
val delayPref = findPreference<EditTextPreference>(context!!.getText(R.string.key_delay))
|
||||
keyLat = mainActivity.getString(R.string.pref_lat_key)
|
||||
keyLon = mainActivity.getString(R.string.pref_lon_key)
|
||||
keyAlt = mainActivity.getString(R.string.pref_alt_key)
|
||||
keyDelay = mainActivity.getString(R.string.pref_refresh_rate_key)
|
||||
|
||||
latPref?.summaryProvider = provider
|
||||
lonPref?.summaryProvider = provider
|
||||
altPref?.summaryProvider = provider
|
||||
delayPref?.summaryProvider = provider
|
||||
findPreference<EditTextPreference>(keyLat)?.apply {
|
||||
summaryProvider = provider
|
||||
|
||||
latPref?.setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
latPref?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (newValue.toString().isEmpty() || newValue.toString().toDouble() < -90.0 || newValue.toString().toDouble() > 90.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_lat_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
|
||||
setOnPreferenceChangeListener { _, newValue ->
|
||||
val valueStr = newValue.toString()
|
||||
if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -90.0 || valueStr.toDouble() > 90.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_lat_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
|
||||
lonPref?.setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
lonPref?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (newValue.toString().isEmpty() || newValue.toString().toDouble() < -180.0 || newValue.toString().toDouble() > 180.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_lon_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
findPreference<EditTextPreference>(keyLon)?.apply {
|
||||
summaryProvider = provider
|
||||
|
||||
altPref?.setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
altPref?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (newValue.toString().isEmpty() || newValue.toString().toDouble() < -413.0 || newValue.toString().toDouble() > 8850.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_alt_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
|
||||
delayPref?.setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER }
|
||||
delayPref?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (newValue.toString().isEmpty() || newValue.toString().toLong() < 250 || newValue.toString().toLong() > 10000) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_update_freq_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
setOnPreferenceChangeListener { _, newValue ->
|
||||
val valueStr = newValue.toString()
|
||||
if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -180.0 || valueStr.toDouble() > 180.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_lon_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
}
|
||||
findPreference<EditTextPreference>(keyAlt)?.apply {
|
||||
summaryProvider = provider
|
||||
|
||||
setOnBindEditTextListener {
|
||||
it.inputType = InputType.TYPE_CLASS_NUMBER or
|
||||
InputType.TYPE_NUMBER_FLAG_DECIMAL or
|
||||
InputType.TYPE_NUMBER_FLAG_SIGNED
|
||||
}
|
||||
|
||||
setOnPreferenceChangeListener { _, newValue ->
|
||||
val valueStr = newValue.toString()
|
||||
if (valueStr.isEmpty() || valueStr == "-" || valueStr.toDouble() < -413.0 || valueStr.toDouble() > 8850.0) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_alt_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
}
|
||||
findPreference<EditTextPreference>(keyDelay)?.apply {
|
||||
summaryProvider = provider
|
||||
|
||||
setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER }
|
||||
|
||||
setOnPreferenceChangeListener { _, newValue ->
|
||||
val valueStr = newValue.toString()
|
||||
if (valueStr.isEmpty() || valueStr.toLong() < 250 || valueStr.toLong() > 10000) {
|
||||
Toast.makeText(
|
||||
mainActivity,
|
||||
getString(R.string.pref_refresh_rate_input_error),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
return@setOnPreferenceChangeListener false
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
return@setOnPreferenceChangeListener true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||
if (key == context!!.getText(R.string.key_lat) ||
|
||||
key == context!!.getText(R.string.key_lon) ||
|
||||
key == context!!.getText(R.string.key_alt)
|
||||
) viewModel.setGroundStationPosition()
|
||||
if (key == keyLat || key == keyLon || key == keyAlt) viewModel.setGroundStationPosition()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* LookingSat. Amateur radio & weather satellite tracker and passes calculator.
|
||||
* Copyright (C) 2019 Arty Bishop (bishop.arty@gmail.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package com.rtbishop.look4sat.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.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.Transmitter
|
||||
|
||||
class TransAdapter : RecyclerView.Adapter<TransAdapter.TransHolder>() {
|
||||
|
||||
inner class TransHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
|
||||
|
||||
private var transList = emptyList<Transmitter>()
|
||||
|
||||
fun setList(list: List<Transmitter>) {
|
||||
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<TextView>(R.id.trans_description)
|
||||
val downlink = holder.itemView.findViewById<TextView>(R.id.trans_downlink)
|
||||
val uplink = holder.itemView.findViewById<TextView>(R.id.trans_uplink)
|
||||
val mode = holder.itemView.findViewById<TextView>(R.id.trans_mode)
|
||||
val inverted = holder.itemView.findViewById<TextView>(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.btn_yes)
|
||||
)
|
||||
} else {
|
||||
inverted.text = String.format(
|
||||
context.getString(R.string.pattern_trans_inverted),
|
||||
context.getString(R.string.btn_no)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
-20
@@ -17,8 +17,9 @@
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package com.rtbishop.look4sat.ui
|
||||
package com.rtbishop.look4sat.ui.adapters
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
@@ -28,10 +29,11 @@ import androidx.navigation.findNavController
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.SatPass
|
||||
import com.rtbishop.look4sat.ui.PassListFragmentDirections
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.SatPassHolder>() {
|
||||
|
||||
private var satPassList = mutableListOf<SatPass>()
|
||||
|
||||
@@ -67,43 +69,54 @@ class SatPassAdapter : RecyclerView.Adapter<SatPassAdapter.PassHolder>() {
|
||||
return satPassList.size
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PassHolder {
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatPassHolder {
|
||||
val itemView = LayoutInflater
|
||||
.from(parent.context)
|
||||
.inflate(R.layout.card_pass, parent, false)
|
||||
return PassHolder(itemView)
|
||||
return SatPassHolder(itemView)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: PassHolder, position: Int) {
|
||||
override fun onBindViewHolder(holder: SatPassHolder, position: Int) {
|
||||
holder.bind(satPassList[position])
|
||||
}
|
||||
|
||||
inner class PassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
inner class SatPassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
|
||||
private val context: Context = itemView.context
|
||||
private val satName = itemView.findViewById<TextView>(R.id.pass_satName)
|
||||
private val satId = itemView.findViewById<TextView>(R.id.pass_satId)
|
||||
private val maxEl = itemView.findViewById<TextView>(R.id.pass_maxEl)
|
||||
private val passVector = itemView.findViewById<TextView>(R.id.pass_azVector)
|
||||
private val passStart = itemView.findViewById<TextView>(R.id.pass_aosTime)
|
||||
private val passEnd = itemView.findViewById<TextView>(R.id.pass_losTime)
|
||||
private val azimuth = itemView.findViewById<TextView>(R.id.pass_azimuth)
|
||||
private val aosTime = itemView.findViewById<TextView>(R.id.pass_aosTime)
|
||||
private val losTime = itemView.findViewById<TextView>(R.id.pass_losTime)
|
||||
private var progressBar = itemView.findViewById<ProgressBar>(R.id.pass_progress)
|
||||
|
||||
fun bind(satPass: SatPass) {
|
||||
val aosTime =
|
||||
SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.startTime)
|
||||
val losTime =
|
||||
SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.endTime)
|
||||
val aos = SimpleDateFormat(
|
||||
context.getString(R.string.pattern_time),
|
||||
Locale.getDefault()
|
||||
).format(satPass.pass.startTime)
|
||||
val los = SimpleDateFormat(
|
||||
context.getString(R.string.pattern_time),
|
||||
Locale.getDefault()
|
||||
).format(satPass.pass.endTime)
|
||||
|
||||
satName.text = satPass.tle.name
|
||||
satId.text = String.format("Id: %d", satPass.tle.catnum)
|
||||
maxEl.text = String.format("MaxEl: %.1f°", satPass.pass.maxEl)
|
||||
passVector.text =
|
||||
String.format("Az: %2d° -> %2d°", satPass.pass.aosAzimuth, satPass.pass.losAzimuth)
|
||||
passStart.text = String.format("AOS - %s", aosTime)
|
||||
passEnd.text = String.format("LOS - %s", losTime)
|
||||
satId.text =
|
||||
String.format(context.getString(R.string.pattern_pass_satId), satPass.tle.catnum)
|
||||
maxEl.text =
|
||||
String.format(context.getString(R.string.pattern_pass_maxEl), satPass.pass.maxEl)
|
||||
azimuth.text = String.format(
|
||||
context.getString(R.string.pattern_pass_azimuth),
|
||||
satPass.pass.aosAzimuth,
|
||||
satPass.pass.losAzimuth
|
||||
)
|
||||
aosTime.text = String.format(context.getString(R.string.pattern_pass_aos), aos)
|
||||
losTime.text = String.format(context.getString(R.string.pattern_pass_los), los)
|
||||
progressBar.progress = satPass.progress
|
||||
|
||||
itemView.setOnClickListener {
|
||||
val action = SkyFragmentDirections.actionNavSkyToNavRadar(satPass)
|
||||
val action = PassListFragmentDirections.actionPassToPolar(satPass)
|
||||
itemView.findNavController().navigate(action)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* LookingSat. Amateur radio & weather satellite tracker and passes calculator.
|
||||
* Copyright (C) 2019 Arty Bishop (bishop.arty@gmail.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package com.rtbishop.look4sat.ui.adapters
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.repo.Transmitter
|
||||
|
||||
class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHolder>() {
|
||||
|
||||
private var transmittersList = emptyList<Transmitter>()
|
||||
|
||||
fun setList(list: List<Transmitter>) {
|
||||
transmittersList = list
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return transmittersList.size
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransmitterHolder {
|
||||
val itemView = LayoutInflater
|
||||
.from(parent.context)
|
||||
.inflate(R.layout.card_trans, parent, false)
|
||||
return TransmitterHolder(itemView)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: TransmitterHolder, position: Int) {
|
||||
holder.bind(transmittersList[position])
|
||||
}
|
||||
|
||||
inner class TransmitterHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
|
||||
private val context: Context = itemView.context
|
||||
private val description = itemView.findViewById<TextView>(R.id.trans_description)
|
||||
private val downlink = itemView.findViewById<TextView>(R.id.trans_downlink)
|
||||
private val uplink = itemView.findViewById<TextView>(R.id.trans_uplink)
|
||||
private val mode = itemView.findViewById<TextView>(R.id.trans_mode)
|
||||
private val inverted = itemView.findViewById<TextView>(R.id.trans_inverted)
|
||||
private val freqDivider = 1000000f
|
||||
|
||||
fun bind(transmitter: Transmitter) {
|
||||
description.text = transmitter.description
|
||||
|
||||
if (transmitter.downlinkLow != null && transmitter.downlinkHigh == null) {
|
||||
downlink.text = String.format(
|
||||
context.getString(R.string.pattern_trans_down_low),
|
||||
transmitter.downlinkLow / freqDivider
|
||||
)
|
||||
} else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) {
|
||||
downlink.text = String.format(
|
||||
context.getString(R.string.pattern_trans_down_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_up_low),
|
||||
transmitter.uplinkLow / freqDivider
|
||||
)
|
||||
} else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) {
|
||||
uplink.text = String.format(
|
||||
context.getString(R.string.pattern_trans_up_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_invert),
|
||||
context.getString(R.string.btn_yes)
|
||||
)
|
||||
} else {
|
||||
inverted.text = String.format(
|
||||
context.getString(R.string.pattern_trans_invert),
|
||||
context.getString(R.string.btn_no)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user