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)
)
}
}
}
}
@@ -5,5 +5,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#C0C0C0"
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" />
</vector>
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<item android:drawable="@color/darkOnLight" />
<item android:drawable="@drawable/launcher_background" />
<item
android:width="240dp"
android:height="240dp"
+4 -4
View File
@@ -17,21 +17,21 @@
app:titleTextColor="@color/themeAccent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/toolbar_layout_timer"
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/toolbar_time_to_aos"
android:id="@+id/toolbar_timer"
style="@style/ToolbarText"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/toolbar_btn_refresh"
app:layout_constraintEnd_toStartOf="@+id/toolbar_filter"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/toolbar_btn_refresh"
android:id="@+id/toolbar_filter"
style="@style/ToolbarButton"
android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toBottomOf="parent"
+13 -13
View File
@@ -2,7 +2,8 @@
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_pass"
style="@style/CardPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
@@ -15,7 +16,7 @@
<TextView
android:id="@+id/pass_satName"
style="@style/CardPass.SatName"
style="@style/CardPassName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
@@ -26,30 +27,29 @@
<TextView
android:id="@+id/pass_satId"
style="@style/CardPass.SideText"
style="@style/CardPassText"
android:layout_marginEnd="8dp"
android:text="@string/pass_satId"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_satName"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/pass_azVector"
style="@style/CardPass.SideText"
android:layout_width="wrap_content"
android:text="@string/pass_azVector"
android:id="@+id/pass_azimuth"
style="@style/CardPassText"
android:text="@string/pass_azimuth"
app:layout_constraintStart_toStartOf="@+id/pass_satName"
app:layout_constraintTop_toBottomOf="@+id/pass_satName" />
<TextView
android:id="@+id/pass_maxEl"
style="@style/CardPass.SideText"
style="@style/CardPassText"
android:text="@string/pass_maxEl"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_azVector"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_azimuth"
app:layout_constraintEnd_toEndOf="@+id/pass_satId" />
<TextView
android:id="@+id/pass_aosTime"
style="@style/CardPass.SideText"
style="@style/CardPassText"
android:layout_marginBottom="4dp"
android:text="@string/pass_aosTime"
app:layout_constraintBottom_toBottomOf="parent"
@@ -58,7 +58,7 @@
<TextView
android:id="@+id/pass_losTime"
style="@style/CardPass.SideText"
style="@style/CardPassText"
android:text="@string/pass_losTime"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_aosTime"
app:layout_constraintEnd_toEndOf="@+id/pass_progress" />
@@ -69,8 +69,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="@+id/pass_maxEl"
app:layout_constraintStart_toStartOf="@+id/pass_azVector"
app:layout_constraintTop_toBottomOf="@+id/pass_azVector" />
app:layout_constraintStart_toStartOf="@+id/pass_azimuth"
app:layout_constraintTop_toBottomOf="@+id/pass_azimuth" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
@@ -2,48 +2,50 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/pass_pref_root"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/pref_hours_ahead_tv"
android:layout_width="wrap_content"
android:id="@+id/pref_tv_hoursAhead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="24dp"
android:text="@string/pref_hours_ahead_summary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/pref_hours_ahead_et"
android:id="@+id/pref_et_hoursAhead"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/pref_hours_ahead_hint"
android:importantForAutofill="no"
android:inputType="number"
app:layout_constraintEnd_toEndOf="@+id/pref_hours_ahead_tv"
app:layout_constraintStart_toStartOf="@+id/pref_hours_ahead_tv"
app:layout_constraintTop_toBottomOf="@+id/pref_hours_ahead_tv" />
app:layout_constraintEnd_toEndOf="@+id/pref_tv_hoursAhead"
app:layout_constraintStart_toStartOf="@+id/pref_tv_hoursAhead"
app:layout_constraintTop_toBottomOf="@+id/pref_tv_hoursAhead" />
<TextView
android:id="@+id/pref_min_el_tv"
android:layout_width="wrap_content"
android:id="@+id/pref_tv_minEl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/pref_min_el_summary"
app:layout_constraintEnd_toEndOf="@+id/pref_hours_ahead_et"
app:layout_constraintStart_toStartOf="@+id/pref_hours_ahead_et"
app:layout_constraintTop_toBottomOf="@+id/pref_hours_ahead_et" />
app:layout_constraintEnd_toEndOf="@+id/pref_et_hoursAhead"
app:layout_constraintStart_toStartOf="@+id/pref_et_hoursAhead"
app:layout_constraintTop_toBottomOf="@+id/pref_et_hoursAhead" />
<EditText
android:id="@+id/pref_min_el_et"
android:id="@+id/pref_et_minEl"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/pref_min_el_hint"
android:importantForAutofill="no"
android:inputType="number|numberDecimal"
app:layout_constraintEnd_toEndOf="@+id/pref_min_el_tv"
app:layout_constraintStart_toStartOf="@+id/pref_min_el_tv"
app:layout_constraintTop_toBottomOf="@+id/pref_min_el_tv" />
app:layout_constraintEnd_toEndOf="@+id/pref_tv_minEl"
app:layout_constraintStart_toStartOf="@+id/pref_tv_minEl"
app:layout_constraintTop_toBottomOf="@+id/pref_tv_minEl" />
</androidx.constraintlayout.widget.ConstraintLayout>
+14 -14
View File
@@ -23,7 +23,7 @@
android:id="@+id/drawer_title"
style="@style/DrawerHeader.Title"
android:layout_marginStart="8dp"
android:text="@string/title"
android:text="@string/drawer_title"
app:layout_constraintBottom_toBottomOf="@+id/drawer_sat_img"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/drawer_sat_img" />
@@ -31,7 +31,7 @@
<TextView
android:id="@+id/drawer_lat"
style="@style/DrawerHeader.Item"
android:text="@string/drawer_latitude"
android:text="@string/drawer_lat"
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lat_value"
app:layout_constraintStart_toStartOf="@+id/drawer_title" />
@@ -40,14 +40,14 @@
style="@style/DrawerHeader.ItemValue"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:text="@string/drawer_latitude_value"
android:text="@string/drawer_lat_value"
app:layout_constraintStart_toEndOf="@+id/drawer_lat"
app:layout_constraintTop_toBottomOf="@+id/drawer_sat_img" />
<TextView
android:id="@+id/drawer_lon"
style="@style/DrawerHeader.Item"
android:text="@string/drawer_longitude"
android:text="@string/drawer_lon"
app:layout_constraintStart_toStartOf="@+id/drawer_lat"
app:layout_constraintTop_toBottomOf="@+id/drawer_lat" />
@@ -55,7 +55,7 @@
android:id="@+id/drawer_lon_value"
style="@style/DrawerHeader.ItemValue"
android:layout_marginStart="8dp"
android:text="@string/drawer_longitude_value"
android:text="@string/drawer_lon_value"
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lon"
app:layout_constraintStart_toEndOf="@+id/drawer_lon" />
@@ -65,7 +65,7 @@
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:contentDescription="@string/placeholder"
android:src="@drawable/ic_location"
android:src="@drawable/ic_update_loc"
app:layout_constraintBottom_toTopOf="@+id/drawer_btn_tle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/drawer_lon_value" />
@@ -74,7 +74,7 @@
android:id="@+id/drawer_tv_loc"
style="@style/DrawerHeader.ButtonText"
android:layout_marginStart="8dp"
android:text="@string/update_location"
android:text="@string/update_loc"
app:layout_constraintBottom_toBottomOf="@+id/drawer_btn_loc"
app:layout_constraintStart_toEndOf="@+id/drawer_btn_loc"
app:layout_constraintTop_toTopOf="@+id/drawer_btn_loc" />
@@ -83,7 +83,7 @@
android:id="@+id/drawer_btn_tle"
style="@style/DrawerHeader.Button"
android:contentDescription="@string/placeholder"
android:src="@drawable/ic_tle"
android:src="@drawable/ic_update_tle"
app:layout_constraintBottom_toTopOf="@+id/drawer_btn_trans"
app:layout_constraintStart_toStartOf="@+id/drawer_btn_loc"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_loc" />
@@ -100,7 +100,7 @@
android:id="@+id/drawer_btn_trans"
style="@style/DrawerHeader.Button"
android:contentDescription="@string/placeholder"
android:src="@drawable/ic_trans"
android:src="@drawable/ic_update_trans"
app:layout_constraintBottom_toTopOf="@+id/drawer_btn_github"
app:layout_constraintStart_toStartOf="@+id/drawer_btn_tle"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_tle" />
@@ -108,7 +108,7 @@
<TextView
android:id="@+id/drawer_tv_trans"
style="@style/DrawerHeader.ButtonText"
android:text="@string/update_transmitters"
android:text="@string/update_trans"
app:layout_constraintBottom_toBottomOf="@+id/drawer_btn_trans"
app:layout_constraintStart_toStartOf="@+id/drawer_tv_tle"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_tle" />
@@ -118,7 +118,7 @@
style="@style/DrawerHeader.Button"
android:layout_marginBottom="8dp"
android:contentDescription="@string/placeholder"
android:src="@drawable/ic_github"
android:src="@drawable/ic_goto_github"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/drawer_btn_trans"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_trans" />
@@ -126,7 +126,7 @@
<TextView
android:id="@+id/drawer_tv_github"
style="@style/DrawerHeader.ButtonText"
android:text="@string/github"
android:text="@string/goto_github"
app:layout_constraintBottom_toBottomOf="@+id/drawer_btn_github"
app:layout_constraintStart_toStartOf="@+id/drawer_tv_trans"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_trans" />
@@ -136,7 +136,7 @@
style="@style/DrawerHeader.Button"
android:layout_marginStart="8dp"
android:contentDescription="@string/placeholder"
android:src="@drawable/ic_exit"
android:src="@drawable/ic_exit_app"
app:layout_constraintBottom_toBottomOf="@+id/drawer_btn_github"
app:layout_constraintStart_toEndOf="@+id/drawer_tv_github"
app:layout_constraintTop_toTopOf="@+id/drawer_btn_github" />
@@ -145,7 +145,7 @@
android:id="@+id/drawer_tv_exit"
style="@style/DrawerHeader.ButtonText"
android:layout_marginStart="8dp"
android:text="@string/exit"
android:text="@string/exit_app"
app:layout_constraintBottom_toBottomOf="@+id/drawer_btn_exit"
app:layout_constraintStart_toEndOf="@+id/drawer_btn_exit"
app:layout_constraintTop_toTopOf="@+id/drawer_btn_exit" />
@@ -4,25 +4,25 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.WorldMapFragment">
tools:context=".ui.MapViewFragment">
<FrameLayout
android:id="@+id/worldmap_frame"
android:id="@+id/map_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/worldmap_night"
android:background="@drawable/worldmap_dark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/worldmap_fab"
android:id="@+id/map_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|start"
android:layout_marginStart="@dimen/fab_margin"
android:layout_marginBottom="@dimen/fab_margin"
android:layout_marginStart="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@drawable/ic_sat_asc_right" />
@@ -5,12 +5,12 @@
android:layout_height="match_parent">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:id="@+id/pass_list_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sky_recycler_future"
android:id="@+id/pass_list_recycler"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
@@ -21,12 +21,12 @@
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/sky_fab"
android:id="@+id/pass_list_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="@dimen/fab_margin"
android:layout_marginBottom="@dimen/fab_margin"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_sat_asc_left" />
@@ -4,10 +4,10 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.RadarFragment">
tools:context=".ui.PolarViewFragment">
<FrameLayout
android:id="@+id/radar_sky_frame"
android:id="@+id/polar_view_frame"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
@@ -16,54 +16,54 @@
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/radar_azimuth"
style="@style/RadarText"
android:id="@+id/polar_azimuth"
style="@style/PolarViewText"
android:layout_marginStart="4dp"
android:text="@string/radar_azimuth"
app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame"
app:layout_constraintStart_toStartOf="@+id/radar_sky_frame" />
android:text="@string/polar_azimuth"
app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame"
app:layout_constraintStart_toStartOf="@+id/polar_view_frame" />
<TextView
android:id="@+id/radar_elevation"
style="@style/RadarText"
android:id="@+id/polar_elevation"
style="@style/PolarViewText"
android:layout_marginEnd="4dp"
android:text="@string/radar_elevation"
android:text="@string/polar_elevation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/radar_sky_frame" />
app:layout_constraintTop_toTopOf="@+id/polar_view_frame" />
<TextView
android:id="@+id/radar_altitude"
style="@style/RadarText"
android:id="@+id/polar_altitude"
style="@style/PolarViewText"
android:layout_marginStart="4dp"
android:text="@string/radar_altitude"
android:text="@string/polar_altitude"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/radar_sky_frame" />
app:layout_constraintTop_toTopOf="@+id/polar_view_frame" />
<TextView
android:id="@+id/radar_range"
style="@style/RadarText"
android:id="@+id/polar_range"
style="@style/PolarViewText"
android:layout_marginEnd="4dp"
android:text="@string/radar_range"
app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame"
app:layout_constraintEnd_toEndOf="@+id/radar_sky_frame" />
android:text="@string/polar_range"
app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame"
app:layout_constraintEnd_toEndOf="@+id/polar_view_frame" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/radar_recycler"
android:id="@+id/polar_recycler"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radar_sky_frame" />
app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" />
<TextView
android:id="@+id/radar_no_trans"
style="@style/RadarText"
android:id="@+id/polar_no_trans"
style="@style/PolarViewText"
android:layout_marginTop="8dp"
android:text="@string/no_trans"
android:text="@string/no_transmitters"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radar_sky_frame" />
app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" />
</androidx.constraintlayout.widget.ConstraintLayout>
+5 -5
View File
@@ -5,13 +5,13 @@
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_sky"
android:id="@+id/nav_pass_list"
android:icon="@drawable/ic_sat_asc_right"
android:title="@string/menu_sky" />
android:title="@string/menu_pass_list" />
<item
android:id="@+id/nav_map"
android:icon="@drawable/ic_map"
android:title="@string/menu_map" />
android:id="@+id/nav_map_view"
android:icon="@drawable/ic_world_map"
android:title="@string/menu_map_view" />
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings"
+15 -15
View File
@@ -3,16 +3,16 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@id/nav_sky">
app:startDestination="@id/nav_pass_list">
<fragment
android:id="@+id/nav_sky"
android:name="com.rtbishop.look4sat.ui.SkyFragment"
android:label="@string/menu_sky"
tools:layout="@layout/fragment_sky">
android:id="@+id/nav_pass_list"
android:name="com.rtbishop.look4sat.ui.PassListFragment"
android:label="@string/menu_pass_list"
tools:layout="@layout/fragment_pass_list">
<action
android:id="@+id/action_nav_sky_to_nav_radar"
app:destination="@id/nav_radar"
android:id="@+id/action_pass_to_polar"
app:destination="@id/nav_polar_view"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_enter_anim"
@@ -20,20 +20,20 @@
</fragment>
<fragment
android:id="@+id/nav_radar"
android:name="com.rtbishop.look4sat.ui.RadarFragment"
android:label="@string/menu_radar"
tools:layout="@layout/fragment_radar">
android:id="@+id/nav_polar_view"
android:name="com.rtbishop.look4sat.ui.PolarViewFragment"
android:label="@string/menu_polar_view"
tools:layout="@layout/fragment_polar_view">
<argument
android:name="satPass"
app:argType="com.rtbishop.look4sat.repo.SatPass" />
</fragment>
<fragment
android:id="@+id/nav_map"
android:name="com.rtbishop.look4sat.ui.WorldMapFragment"
android:label="@string/menu_map"
tools:layout="@layout/fragment_worldmap" />
android:id="@+id/nav_map_view"
android:name="com.rtbishop.look4sat.ui.MapViewFragment"
android:label="@string/menu_map_view"
tools:layout="@layout/fragment_map_view" />
<fragment
android:id="@+id/nav_credits"
+2 -4
View File
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="themeAccent">#FFE082</color>
<color name="darkOnLight">#101010</color>
<color name="lightOnDark">#C0C0C0</color>
<color name="toolbarButton">#191919</color>
<color name="themeLight">#C0C0C0</color>
<color name="themeDark">#191919</color>
<color name="backgroundDark">#080808</color>
<color name="error">#800000</color>
<color name="satTrack">#D50000</color>
<color name="satFootprint">#FFE082</color>
</resources>
-3
View File
@@ -1,3 +0,0 @@
<resources>
<dimen name="fab_margin">16dp</dimen>
</resources>
+109 -97
View File
@@ -1,110 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Look4Sat</string>
<string name="title">L∞king \n4Sat…</string>
<string name="drawer_latitude">Latitude: </string>
<string name="drawer_latitude_value">51.5074</string>
<string name="drawer_longitude">Longitude: </string>
<string name="drawer_longitude_value">0.1278</string>
<string name="drawer_title">L∞king \n4Sat…</string>
<string name="drawer_lat">Latitude: </string>
<string name="drawer_lat_value">51.5074</string>
<string name="drawer_lon">Longitude: </string>
<string name="drawer_lon_value">0.1278</string>
<string name="update_location">Update location</string>
<string name="update_loc">Update location</string>
<string name="update_tle">Update TLE file</string>
<string name="update_transmitters">Update transmitters DB</string>
<string name="github">GitHub</string>
<string name="exit">Exit</string>
<string name="menu_sky">Sky at a Glance</string>
<string name="menu_radar">Radar View</string>
<string name="menu_map">World Map View</string>
<string name="menu_settings">Settings</string>
<string name="menu_credits">Credits</string>
<string name="menu_about">About the App</string>
<string name="pass_satName">Meteor M2–2</string>
<string name="pass_satId">ID: 48680</string>
<string name="pass_azVector">Az: 180° -> 360°</string>
<string name="pass_maxEl">MaxEl: 75.5°</string>
<string name="pass_aosTime">AOS - 13:14:15</string>
<string name="pass_losTime">LOS - 16:17:18</string>
<string name="radar_azimuth">Azimuth: 180.00°</string>
<string name="radar_elevation">Elevation: 75.50°</string>
<string name="radar_altitude">Altitude: 850 km</string>
<string name="radar_range">Range: 12000 km</string>
<string name="btn_ok">OK</string>
<string name="btn_cancel">Cancel</string>
<string name="btn_clear">Clear All</string>
<string name="btn_no">No</string>
<string name="btn_yes">Yes</string>
<string name="dialog_select_sat">Select satellites to track</string>
<string name="dialog_show_track">Show ground track for…</string>
<string name="dialog_pass_prefs">Satellite pass preferences</string>
<string name="pref_hours_ahead_summary">Show passes that occur within X hours</string>
<string name="pref_hours_ahead_hint">Hours ahead</string>
<string name="pref_min_el_summary">Show passes with max elevation above</string>
<string name="pref_min_el_hint">Minimum elevation</string>
<string name="pref_gsp_title">Ground station position settings</string>
<string name="pref_lat_title">Latitude</string>
<string name="pref_lat_input_error">Lat should be within -90 to 90 deg</string>
<string name="pref_lon_title">Longitude</string>
<string name="pref_lon_input_error">Lon should be within -180 to 180 deg</string>
<string name="pref_alt_title">Altitude</string>
<string name="pref_alt_input_error">Alt should be within -413 to 8850 m</string>
<string name="pref_other_title">Other settings</string>
<string name="pref_update_freq_title">Update frequency</string>
<string name="pref_update_freq_input_error">Value should be within 250 to 10000 ms</string>
<string name="pref_update_freq_summary">Views update interval, ms</string>
<string name="def_gsp_loc">0.0</string>
<string name="def_hours_ahead">8</string>
<string name="def_min_el">16.0</string>
<string name="def_update_freq">3000</string>
<string name="key_lat">latitude</string>
<string name="key_lon">longitude</string>
<string name="key_alt">altitude</string>
<string name="key_hours_ahead">hoursAhead</string>
<string name="key_min_el">minEl</string>
<string name="key_delay">delay</string>
<string name="tle_main_list_file_name">tleFile.txt</string>
<string name="tle_selection_file_name">tleSelection</string>
<string name="no_mode">Mode: Null</string>
<string name="no_uplink">Uplink: Null</string>
<string name="no_downlink">Downlink: Null</string>
<string name="no_permissions">Missing permissions</string>
<string name="no_trans">No transmitters found for this Satellite</string>
<string name="no_selected_sat">No satellites were shortlisted</string>
<string name="trans_description">ARGOS-3 A-DCS 465.9875MHz</string>
<string name="trans_downlink">Downlink: 465.9875 MHz</string>
<string name="trans_uplink">Uplink: 465.9875 MHz</string>
<string name="trans_mode">Mode: BPSK400</string>
<string name="trans_inverted">Inverted: Yes</string>
<string name="trans_header">Transmitters:</string>
<string name="pattern_location">%.4f</string>
<string name="pattern_aos">AOS -%02d:%02d:%02d</string>
<string name="pattern_los">LOS -%02d:%02d:%02d</string>
<string name="pattern_trans_mode">Mode: %s</string>
<string name="pattern_trans_inverted">Inverted: %s</string>
<string name="pattern_trans_uplink_low">Uplink: %.4f MHz</string>
<string name="pattern_trans_uplink_lowHigh">Uplink: %.4f - %.4f MHz</string>
<string name="pattern_trans_downlink_low">Downlink: %.4f MHz</string>
<string name="pattern_trans_downlink_lowHigh">Downlink: %.4f - %.4f MHz</string>
<string name="map_gsp">GSP</string>
<string name="map_content">Nasa Map</string>
<string name="placeholder">Placeholder</string>
<string name="update_trans">Update transmitters DB</string>
<string name="goto_github">GitHub</string>
<string name="exit_app">Exit</string>
<string name="updateLocSuccess">Location was updated</string>
<string name="updateTleSuccess">TLE file was updated</string>
<string name="updateTleFailure">Could not update TLE file</string>
<string name="updateTransSuccess">Transmitters database was updated</string>
<string name="updateTransFailure">Could not update transmitters</string>
<string name="menu_pass_list">List of passes</string>
<string name="menu_polar_view">Polar View</string>
<string name="menu_map_view">World Map View</string>
<string name="menu_settings">Settings</string>
<string name="menu_credits">Credits</string>
<string name="menu_about">About the App</string>
<string name="pass_satName">Meteor M2–2</string>
<string name="pass_satId">ID: 48680</string>
<string name="pass_azimuth">Az: 180° -> 360°</string>
<string name="pass_maxEl">MaxEl: 75.5°</string>
<string name="pass_aosTime">AOS - 13:14:15</string>
<string name="pass_losTime">LOS - 16:17:18</string>
<string name="polar_azimuth">Azimuth: 180.00°</string>
<string name="polar_elevation">Elevation: 75.50°</string>
<string name="polar_altitude">Altitude: 850 km</string>
<string name="polar_range">Range: 12000 km</string>
<string name="trans_description">ARGOS-3 A-DCS 465.9875MHz</string>
<string name="trans_downlink">Downlink: 465.9875 MHz</string>
<string name="trans_uplink">Uplink: 465.9875 MHz</string>
<string name="trans_mode">Mode: BPSK400</string>
<string name="trans_inverted">Inverted: Yes</string>
<string name="dialog_select_sat">Select satellites to track</string>
<string name="dialog_show_track">Show ground track for…</string>
<string name="dialog_filter_passes">Filter passes</string>
<string name="pref_hours_ahead_key">hoursAhead</string>
<string name="pref_hours_ahead_hint">Hours ahead</string>
<string name="pref_hours_ahead_summary">Show passes that occur within X hours</string>
<string name="pref_hours_ahead_input_error">Value should be within 1–168 hours</string>
<string name="pref_min_el_key">minEl</string>
<string name="pref_min_el_hint">Minimum elevation</string>
<string name="pref_min_el_summary">Show passes with max elevation above</string>
<string name="pref_min_el_input_error">Value should be within 0–90 deg</string>
<string name="pref_gsp_title">Ground station position settings</string>
<string name="pref_lat_key">latitude</string>
<string name="pref_lat_title">Latitude</string>
<string name="pref_lat_input_error">Lat should be within -90 to 90 deg</string>
<string name="pref_lon_key">longitude</string>
<string name="pref_lon_title">Longitude</string>
<string name="pref_lon_input_error">Lon should be within -180 to 180 deg</string>
<string name="pref_alt_key">altitude</string>
<string name="pref_alt_title">Altitude</string>
<string name="pref_alt_input_error">Alt should be within -413 to 8850 m</string>
<string name="pref_other_title">Other settings</string>
<string name="pref_refresh_rate_key">rate</string>
<string name="pref_refresh_rate_title">Refresh rate</string>
<string name="pref_refresh_rate_input_error">Value should be within 250 to 10000 ms</string>
<string name="pref_refresh_rate_summary">Views update interval, ms</string>
<string name="no_permissions">Missing permissions</string>
<string name="no_mode">Mode: Null</string>
<string name="no_uplink">Uplink: Null</string>
<string name="no_downlink">Downlink: Null</string>
<string name="no_transmitters">No transmitters found for this Satellite</string>
<string name="no_selected_sat">No satellites were shortlisted</string>
<string name="no_tle_found">TLE file was not found</string>
<string name="no_selection_found">Selection file was not found</string>
<string name="error_sat_wont_pass">Certain satellites will never pass</string>
<string name="error_sat_tle">There was a problem with a satellite TLE</string>
<string name="error_update_tle">Please, update your TLE</string>
<string name="error_enter_value">Please, enter the value</string>
<string name="pattern_loc">%.4f</string>
<string name="pattern_time">HH:mm:ss</string>
<string name="pattern_timer_aos">AOS -%02d:%02d:%02d</string>
<string name="pattern_timer_los">LOS -%02d:%02d:%02d</string>
<string name="pattern_pass_aos">AOS - %s</string>
<string name="pattern_pass_los">LOS - %s</string>
<string name="pattern_pass_satId">Id: %d</string>
<string name="pattern_pass_maxEl">MaxEl: %.1f°</string>
<string name="pattern_pass_azimuth">Az: %2d° -> %2d°</string>
<string name="pattern_polar_azimuth">Azimuth: %.1f°</string>
<string name="pattern_polar_elev">Elevation: %.1f°</string>
<string name="pattern_polar_range">Range: %.0f km</string>
<string name="pattern_polar_alt">Altitude: %.0f km</string>
<string name="pattern_trans_mode">Mode: %s</string>
<string name="pattern_trans_invert">Inverted: %s</string>
<string name="pattern_trans_up_low">Uplink: %.4f MHz</string>
<string name="pattern_trans_up_lowHigh">Uplink: %.4f - %.4f MHz</string>
<string name="pattern_trans_down_low">Downlink: %.4f MHz</string>
<string name="pattern_trans_down_lowHigh">Downlink: %.4f - %.4f MHz</string>
<string name="btn_yes">Yes</string>
<string name="btn_no">No</string>
<string name="btn_ok">OK</string>
<string name="btn_cancel">Cancel</string>
<string name="btn_clear">Clear All</string>
<string name="map_gsp">GSP</string>
<string name="placeholder">Placeholder</string>
</resources>
+11 -18
View File
@@ -4,12 +4,10 @@
<item name="colorPrimary">@color/themeAccent</item>
<item name="colorSecondary">@color/themeAccent</item>
<item name="colorSurface">@color/backgroundDark</item>
<item name="colorError">@color/error</item>
<item name="colorOnPrimary">@color/darkOnLight</item>
<item name="colorOnSecondary">@color/darkOnLight</item>
<item name="colorOnSurface">@color/lightOnDark</item>
<item name="colorOnError">@color/lightOnDark</item>
<item name="colorOnPrimary">@color/backgroundDark</item>
<item name="colorOnSecondary">@color/backgroundDark</item>
<item name="colorOnSurface">@color/themeLight</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@@ -23,7 +21,7 @@
<style name="DrawerHeader">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/lightOnDark</item>
<item name="android:textColor">@color/themeLight</item>
</style>
<style name="DrawerHeader.Title">
@@ -64,39 +62,34 @@
<style name="ToolbarButton">
<item name="android:layout_width">48dp</item>
<item name="android:layout_height">48dp</item>
<item name="android:src">@drawable/ic_prefs</item>
<item name="android:backgroundTint">@color/toolbarButton</item>
<item name="android:src">@drawable/ic_filter</item>
<item name="android:backgroundTint">@color/themeDark</item>
</style>
<style name="CardPass">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="CardPass.SideText">
<style name="CardPassText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">18sp</item>
</style>
<style name="CardPass.SatName">
<style name="CardPassName">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">21sp</item>
<item name="android:textColor">@color/themeAccent</item>
</style>
<style name="RadarText">
<style name="PolarViewText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/lightOnDark</item>
<item name="android:textColor">@color/themeLight</item>
<item name="android:textSize">15sp</item>
</style>
<style name="CardTransText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/lightOnDark</item>
<item name="android:textColor">@color/themeLight</item>
<item name="android:textSize">15sp</item>
</style>
+10 -10
View File
@@ -2,31 +2,31 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/pref_gsp_title">
<EditTextPreference
android:defaultValue="@string/def_gsp_loc"
android:key="@string/key_lat"
android:defaultValue="0.0"
android:key="@string/pref_lat_key"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_lat_title" />
<EditTextPreference
android:defaultValue="@string/def_gsp_loc"
android:key="@string/key_lon"
android:defaultValue="0.0"
android:key="@string/pref_lon_key"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_lon_title" />
<EditTextPreference
android:defaultValue="@string/def_gsp_loc"
android:key="@string/key_alt"
android:defaultValue="0.0"
android:key="@string/pref_alt_key"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_alt_title" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_other_title">
<EditTextPreference
android:defaultValue="@string/def_update_freq"
android:key="@string/key_delay"
android:defaultValue="3000"
android:key="@string/pref_refresh_rate_key"
android:selectAllOnFocus="true"
android:singleLine="true"
android:summary="@string/pref_update_freq_summary"
android:title="@string/pref_update_freq_title" />
android:summary="@string/pref_refresh_rate_summary"
android:title="@string/pref_refresh_rate_title" />
</PreferenceCategory>
</PreferenceScreen>