Major classes, variables and strings refactoring. Code cleanup.

This commit is contained in:
Arty Bishop committed 2020-01-13 23:14:17 +00:00
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)
})
}
@@ -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
@@ -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)
}
}
@@ -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)
)
}
}
}
@@ -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)
)
}
}
}
}