From bb25ef8d6245b6da9c964fb817fb3293b23dac78 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Mon, 13 Jan 2020 23:14:17 +0000 Subject: [PATCH] Major classes, variables and strings refactoring. Code cleanup. --- .../com/rtbishop/look4sat/MainViewModel.kt | 50 +++-- .../com/rtbishop/look4sat/ui/MainActivity.kt | 12 +- ...WorldMapFragment.kt => MapViewFragment.kt} | 26 +-- .../{SkyFragment.kt => PassListFragment.kt} | 73 ++++--- ...{RadarFragment.kt => PolarViewFragment.kt} | 73 ++++--- .../rtbishop/look4sat/ui/SettingsFragment.kt | 154 +++++++------ .../com/rtbishop/look4sat/ui/TransAdapter.kt | 111 ---------- .../ui/{ => adapters}/SatPassAdapter.kt | 53 +++-- .../ui/adapters/TransmitterAdapter.kt | 116 ++++++++++ .../drawable/{ic_exit.xml => ic_exit_app.xml} | 0 .../drawable/{ic_prefs.xml => ic_filter.xml} | 2 +- .../{ic_github.xml => ic_goto_github.xml} | 0 .../{ic_location.xml => ic_update_loc.xml} | 0 .../{ic_tle.xml => ic_update_tle.xml} | 0 .../{ic_trans.xml => ic_update_trans.xml} | 0 .../drawable/{ic_map.xml => ic_world_map.xml} | 0 app/src/main/res/drawable/splash_drawable.xml | 2 +- ...worldmap_night.webp => worldmap_dark.webp} | Bin ...{worldmap_day.webp => worldmap_light.webp} | Bin app/src/main/res/layout/app_bar_main.xml | 8 +- app/src/main/res/layout/card_pass.xml | 26 +-- .../{card_transmitter.xml => card_trans.xml} | 0 ...sat_pass_pref.xml => dialog_pass_pref.xml} | 34 +-- app/src/main/res/layout/drawer_header.xml | 28 +-- ...ent_worldmap.xml => fragment_map_view.xml} | 12 +- ...ragment_sky.xml => fragment_pass_list.xml} | 10 +- ...ment_radar.xml => fragment_polar_view.xml} | 52 ++--- app/src/main/res/menu/drawer_menu.xml | 10 +- app/src/main/res/navigation/nav_graph.xml | 30 +-- app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/strings.xml | 206 +++++++++--------- app/src/main/res/values/styles.xml | 29 +-- app/src/main/res/xml/preference.xml | 20 +- 34 files changed, 601 insertions(+), 545 deletions(-) rename app/src/main/java/com/rtbishop/look4sat/ui/{WorldMapFragment.kt => MapViewFragment.kt} (93%) rename app/src/main/java/com/rtbishop/look4sat/ui/{SkyFragment.kt => PassListFragment.kt} (81%) rename app/src/main/java/com/rtbishop/look4sat/ui/{RadarFragment.kt => PolarViewFragment.kt} (77%) delete mode 100644 app/src/main/java/com/rtbishop/look4sat/ui/TransAdapter.kt rename app/src/main/java/com/rtbishop/look4sat/ui/{ => adapters}/SatPassAdapter.kt (64%) create mode 100644 app/src/main/java/com/rtbishop/look4sat/ui/adapters/TransmitterAdapter.kt rename app/src/main/res/drawable/{ic_exit.xml => ic_exit_app.xml} (100%) rename app/src/main/res/drawable/{ic_prefs.xml => ic_filter.xml} (52%) rename app/src/main/res/drawable/{ic_github.xml => ic_goto_github.xml} (100%) rename app/src/main/res/drawable/{ic_location.xml => ic_update_loc.xml} (100%) rename app/src/main/res/drawable/{ic_tle.xml => ic_update_tle.xml} (100%) rename app/src/main/res/drawable/{ic_trans.xml => ic_update_trans.xml} (100%) rename app/src/main/res/drawable/{ic_map.xml => ic_world_map.xml} (100%) rename app/src/main/res/drawable/{worldmap_night.webp => worldmap_dark.webp} (100%) rename app/src/main/res/drawable/{worldmap_day.webp => worldmap_light.webp} (100%) rename app/src/main/res/layout/{card_transmitter.xml => card_trans.xml} (100%) rename app/src/main/res/layout/{sat_pass_pref.xml => dialog_pass_pref.xml} (53%) rename app/src/main/res/layout/{fragment_worldmap.xml => fragment_map_view.xml} (75%) rename app/src/main/res/layout/{fragment_sky.xml => fragment_pass_list.xml} (80%) rename app/src/main/res/layout/{fragment_radar.xml => fragment_polar_view.xml} (52%) delete mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt index 9f28c404..869da1ab 100644 --- a/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/MainViewModel.kt @@ -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() val debugMessage: LiveData = _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 } 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 } 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()) diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt index a83b7415..14a5c2e6 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt @@ -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) }) } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt similarity index 93% rename from app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt index 298a9510..d269f404 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt @@ -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 diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt similarity index 81% rename from app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt index 8444133d..9da72bbb 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt @@ -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 @@ -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(R.id.pref_hours_ahead_et) - val etMinEl = satPassPrefView.findViewById(R.id.pref_min_el_et) + val satPassPrefView = View.inflate(mainActivity, R.layout.dialog_pass_pref, null) + val etHoursAhead = satPassPrefView.findViewById(R.id.pref_et_hoursAhead) + val etMinEl = satPassPrefView.findViewById(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, selectionList: MutableList) { 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(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) } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/RadarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt similarity index 77% rename from app/src/main/java/com/rtbishop/look4sat/ui/RadarFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt index 32f58c3e..b4f7c79b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt @@ -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) { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SettingsFragment.kt index ee62b732..4a1a074d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SettingsFragment.kt @@ -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(context!!.getText(R.string.key_lat)) - val lonPref = findPreference(context!!.getText(R.string.key_lon)) - val altPref = findPreference(context!!.getText(R.string.key_alt)) - val delayPref = findPreference(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(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(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(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(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() { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/TransAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/TransAdapter.kt deleted file mode 100644 index b3714b6c..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/ui/TransAdapter.kt +++ /dev/null @@ -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() { - - inner class TransHolder(itemView: View) : RecyclerView.ViewHolder(itemView) - - private var transList = emptyList() - - fun setList(list: List) { - transList = list - } - - override fun getItemCount(): Int { - return transList.size - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransHolder { - val itemView = LayoutInflater - .from(parent.context) - .inflate(R.layout.card_transmitter, parent, false) - return TransHolder(itemView) - } - - override fun onBindViewHolder(holder: TransHolder, position: Int) { - val context = holder.itemView.context - val freqDivider = 1000000f - val transmitter = transList[position] - val description = holder.itemView.findViewById(R.id.trans_description) - val downlink = holder.itemView.findViewById(R.id.trans_downlink) - val uplink = holder.itemView.findViewById(R.id.trans_uplink) - val mode = holder.itemView.findViewById(R.id.trans_mode) - val inverted = holder.itemView.findViewById(R.id.trans_inverted) - - description.text = transmitter.description - - if (transmitter.downlinkLow != null && transmitter.downlinkHigh == null) { - downlink.text = String.format( - context.getString(R.string.pattern_trans_downlink_low), - transmitter.downlinkLow / freqDivider - ) - } else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) { - downlink.text = String.format( - context.getString(R.string.pattern_trans_downlink_lowHigh), - transmitter.downlinkLow / freqDivider, - transmitter.downlinkHigh / freqDivider - ) - } else { - downlink.text = context.getString(R.string.no_downlink) - } - - if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) { - uplink.text = String.format( - context.getString(R.string.pattern_trans_uplink_low), - transmitter.uplinkLow / freqDivider - ) - } else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) { - uplink.text = String.format( - context.getString(R.string.pattern_trans_uplink_lowHigh), - transmitter.uplinkLow / freqDivider, - transmitter.uplinkHigh / freqDivider - ) - } else { - uplink.text = context.getString(R.string.no_uplink) - } - - if (transmitter.mode != null) { - mode.text = - String.format(context.getString(R.string.pattern_trans_mode), transmitter.mode) - } else { - mode.text = context.getString(R.string.no_mode) - } - if (transmitter.isInverted) { - inverted.text = String.format( - context.getString(R.string.pattern_trans_inverted), - context.getString(R.string.btn_yes) - ) - } else { - inverted.text = String.format( - context.getString(R.string.pattern_trans_inverted), - context.getString(R.string.btn_no) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt similarity index 64% rename from app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt index 2b1165d3..2ca825bf 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/SatPassAdapter.kt @@ -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() { +class SatPassAdapter : RecyclerView.Adapter() { private var satPassList = mutableListOf() @@ -67,43 +69,54 @@ class SatPassAdapter : RecyclerView.Adapter() { 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(R.id.pass_satName) private val satId = itemView.findViewById(R.id.pass_satId) private val maxEl = itemView.findViewById(R.id.pass_maxEl) - private val passVector = itemView.findViewById(R.id.pass_azVector) - private val passStart = itemView.findViewById(R.id.pass_aosTime) - private val passEnd = itemView.findViewById(R.id.pass_losTime) + private val azimuth = itemView.findViewById(R.id.pass_azimuth) + private val aosTime = itemView.findViewById(R.id.pass_aosTime) + private val losTime = itemView.findViewById(R.id.pass_losTime) private var progressBar = itemView.findViewById(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) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TransmitterAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TransmitterAdapter.kt new file mode 100644 index 00000000..5307155f --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TransmitterAdapter.kt @@ -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() { + + private var transmittersList = emptyList() + + fun setList(list: List) { + 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(R.id.trans_description) + private val downlink = itemView.findViewById(R.id.trans_downlink) + private val uplink = itemView.findViewById(R.id.trans_uplink) + private val mode = itemView.findViewById(R.id.trans_mode) + private val inverted = itemView.findViewById(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) + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit_app.xml similarity index 100% rename from app/src/main/res/drawable/ic_exit.xml rename to app/src/main/res/drawable/ic_exit_app.xml diff --git a/app/src/main/res/drawable/ic_prefs.xml b/app/src/main/res/drawable/ic_filter.xml similarity index 52% rename from app/src/main/res/drawable/ic_prefs.xml rename to app/src/main/res/drawable/ic_filter.xml index 16e5164d..a757a8f8 100644 --- a/app/src/main/res/drawable/ic_prefs.xml +++ b/app/src/main/res/drawable/ic_filter.xml @@ -5,5 +5,5 @@ android:viewportHeight="24.0"> + android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" /> diff --git a/app/src/main/res/drawable/ic_github.xml b/app/src/main/res/drawable/ic_goto_github.xml similarity index 100% rename from app/src/main/res/drawable/ic_github.xml rename to app/src/main/res/drawable/ic_goto_github.xml diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_update_loc.xml similarity index 100% rename from app/src/main/res/drawable/ic_location.xml rename to app/src/main/res/drawable/ic_update_loc.xml diff --git a/app/src/main/res/drawable/ic_tle.xml b/app/src/main/res/drawable/ic_update_tle.xml similarity index 100% rename from app/src/main/res/drawable/ic_tle.xml rename to app/src/main/res/drawable/ic_update_tle.xml diff --git a/app/src/main/res/drawable/ic_trans.xml b/app/src/main/res/drawable/ic_update_trans.xml similarity index 100% rename from app/src/main/res/drawable/ic_trans.xml rename to app/src/main/res/drawable/ic_update_trans.xml diff --git a/app/src/main/res/drawable/ic_map.xml b/app/src/main/res/drawable/ic_world_map.xml similarity index 100% rename from app/src/main/res/drawable/ic_map.xml rename to app/src/main/res/drawable/ic_world_map.xml diff --git a/app/src/main/res/drawable/splash_drawable.xml b/app/src/main/res/drawable/splash_drawable.xml index 90586d92..3b2f6913 100644 --- a/app/src/main/res/drawable/splash_drawable.xml +++ b/app/src/main/res/drawable/splash_drawable.xml @@ -1,7 +1,7 @@ - + @@ -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" /> \ No newline at end of file diff --git a/app/src/main/res/layout/card_transmitter.xml b/app/src/main/res/layout/card_trans.xml similarity index 100% rename from app/src/main/res/layout/card_transmitter.xml rename to app/src/main/res/layout/card_trans.xml diff --git a/app/src/main/res/layout/sat_pass_pref.xml b/app/src/main/res/layout/dialog_pass_pref.xml similarity index 53% rename from app/src/main/res/layout/sat_pass_pref.xml rename to app/src/main/res/layout/dialog_pass_pref.xml index aecfe8aa..7b0f3422 100644 --- a/app/src/main/res/layout/sat_pass_pref.xml +++ b/app/src/main/res/layout/dialog_pass_pref.xml @@ -2,48 +2,50 @@ + app:layout_constraintEnd_toEndOf="@+id/pref_tv_hoursAhead" + app:layout_constraintStart_toStartOf="@+id/pref_tv_hoursAhead" + app:layout_constraintTop_toBottomOf="@+id/pref_tv_hoursAhead" /> + app:layout_constraintEnd_toEndOf="@+id/pref_et_hoursAhead" + app:layout_constraintStart_toStartOf="@+id/pref_et_hoursAhead" + app:layout_constraintTop_toBottomOf="@+id/pref_et_hoursAhead" /> + app:layout_constraintEnd_toEndOf="@+id/pref_tv_minEl" + app:layout_constraintStart_toStartOf="@+id/pref_tv_minEl" + app:layout_constraintTop_toBottomOf="@+id/pref_tv_minEl" /> \ No newline at end of file diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml index ab2dd1aa..aaff6959 100644 --- a/app/src/main/res/layout/drawer_header.xml +++ b/app/src/main/res/layout/drawer_header.xml @@ -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 @@ @@ -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" /> @@ -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 @@ @@ -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 @@ @@ -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" /> diff --git a/app/src/main/res/layout/fragment_worldmap.xml b/app/src/main/res/layout/fragment_map_view.xml similarity index 75% rename from app/src/main/res/layout/fragment_worldmap.xml rename to app/src/main/res/layout/fragment_map_view.xml index dc47a356..6aa68080 100644 --- a/app/src/main/res/layout/fragment_worldmap.xml +++ b/app/src/main/res/layout/fragment_map_view.xml @@ -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"> diff --git a/app/src/main/res/layout/fragment_sky.xml b/app/src/main/res/layout/fragment_pass_list.xml similarity index 80% rename from app/src/main/res/layout/fragment_sky.xml rename to app/src/main/res/layout/fragment_pass_list.xml index fba283a2..de3700a9 100644 --- a/app/src/main/res/layout/fragment_sky.xml +++ b/app/src/main/res/layout/fragment_pass_list.xml @@ -5,12 +5,12 @@ android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/fragment_radar.xml b/app/src/main/res/layout/fragment_polar_view.xml similarity index 52% rename from app/src/main/res/layout/fragment_radar.xml rename to app/src/main/res/layout/fragment_polar_view.xml index d524911d..76e72a14 100644 --- a/app/src/main/res/layout/fragment_radar.xml +++ b/app/src/main/res/layout/fragment_polar_view.xml @@ -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"> + android:text="@string/polar_azimuth" + app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame" + app:layout_constraintStart_toStartOf="@+id/polar_view_frame" /> + app:layout_constraintTop_toTopOf="@+id/polar_view_frame" /> + app:layout_constraintTop_toTopOf="@+id/polar_view_frame" /> + android:text="@string/polar_range" + app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame" + app:layout_constraintEnd_toEndOf="@+id/polar_view_frame" /> + app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" /> + app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" /> \ No newline at end of file diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml index f46d2622..cc2d0142 100644 --- a/app/src/main/res/menu/drawer_menu.xml +++ b/app/src/main/res/menu/drawer_menu.xml @@ -5,13 +5,13 @@ + android:title="@string/menu_pass_list" /> + android:id="@+id/nav_map_view" + android:icon="@drawable/ic_world_map" + android:title="@string/menu_map_view" /> + app:startDestination="@id/nav_pass_list"> + 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"> + 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"> + 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" /> #FFE082 - #101010 - #C0C0C0 - #191919 + #C0C0C0 + #191919 #080808 - #800000 #D50000 #FFE082 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml deleted file mode 100644 index 59a0b0c4..00000000 --- a/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,3 +0,0 @@ - - 16dp - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a2fc86f..a68176a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,110 +1,122 @@ Look4Sat - L∞king \n4Sat… - Latitude: - 51.5074 - Longitude: - 0.1278 + L∞king \n4Sat… + Latitude: + 51.5074 + Longitude: + 0.1278 - Update location + Update location Update TLE file - Update transmitters DB - GitHub - Exit - - Sky at a Glance - Radar View - World Map View - Settings - Credits - About the App - - Meteor M2–2 - ID: 48680 - Az: 180° -> 360° - MaxEl: 75.5° - AOS - 13:14:15 - LOS - 16:17:18 - - Azimuth: 180.00° - Elevation: 75.50° - Altitude: 850 km - Range: 12000 km - - OK - Cancel - Clear All - No - Yes - - Select satellites to track - Show ground track for… - Satellite pass preferences - - Show passes that occur within X hours - Hours ahead - Show passes with max elevation above - Minimum elevation - - Ground station position settings - Latitude - Lat should be within -90 to 90 deg - Longitude - Lon should be within -180 to 180 deg - Altitude - Alt should be within -413 to 8850 m - Other settings - Update frequency - Value should be within 250 to 10000 ms - Views update interval, ms - - 0.0 - 8 - 16.0 - 3000 - - latitude - longitude - altitude - hoursAhead - minEl - delay - tleFile.txt - tleSelection - - Mode: Null - Uplink: Null - Downlink: Null - Missing permissions - No transmitters found for this Satellite - No satellites were shortlisted - - ARGOS-3 A-DCS 465.9875MHz - Downlink: 465.9875 MHz - Uplink: 465.9875 MHz - Mode: BPSK400 - Inverted: Yes - Transmitters: - - %.4f - AOS -%02d:%02d:%02d - LOS -%02d:%02d:%02d - Mode: %s - Inverted: %s - Uplink: %.4f MHz - Uplink: %.4f - %.4f MHz - Downlink: %.4f MHz - Downlink: %.4f - %.4f MHz - - GSP - Nasa Map - Placeholder + Update transmitters DB + GitHub + Exit Location was updated TLE file was updated Could not update TLE file Transmitters database was updated Could not update transmitters + + List of passes + Polar View + World Map View + Settings + Credits + About the App + + Meteor M2–2 + ID: 48680 + Az: 180° -> 360° + MaxEl: 75.5° + AOS - 13:14:15 + LOS - 16:17:18 + + Azimuth: 180.00° + Elevation: 75.50° + Altitude: 850 km + Range: 12000 km + + ARGOS-3 A-DCS 465.9875MHz + Downlink: 465.9875 MHz + Uplink: 465.9875 MHz + Mode: BPSK400 + Inverted: Yes + + Select satellites to track + Show ground track for… + Filter passes + + hoursAhead + Hours ahead + Show passes that occur within X hours + Value should be within 1–168 hours + minEl + Minimum elevation + Show passes with max elevation above + Value should be within 0–90 deg + + Ground station position settings + latitude + Latitude + Lat should be within -90 to 90 deg + longitude + Longitude + Lon should be within -180 to 180 deg + altitude + Altitude + Alt should be within -413 to 8850 m + Other settings + rate + Refresh rate + Value should be within 250 to 10000 ms + Views update interval, ms + + Missing permissions + Mode: Null + Uplink: Null + Downlink: Null + No transmitters found for this Satellite + No satellites were shortlisted + TLE file was not found + Selection file was not found + + Certain satellites will never pass + There was a problem with a satellite TLE + Please, update your TLE + Please, enter the value + + %.4f + HH:mm:ss + AOS -%02d:%02d:%02d + LOS -%02d:%02d:%02d + + AOS - %s + LOS - %s + Id: %d + MaxEl: %.1f° + Az: %2d° -> %2d° + + Azimuth: %.1f° + Elevation: %.1f° + Range: %.0f km + Altitude: %.0f km + + Mode: %s + Inverted: %s + Uplink: %.4f MHz + Uplink: %.4f - %.4f MHz + Downlink: %.4f MHz + Downlink: %.4f - %.4f MHz + + Yes + No + OK + Cancel + Clear All + + GSP + Placeholder diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b42da771..38a8a55a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,12 +4,10 @@ @color/themeAccent @color/themeAccent @color/backgroundDark - @color/error - @color/darkOnLight - @color/darkOnLight - @color/lightOnDark - @color/lightOnDark + @color/backgroundDark + @color/backgroundDark + @color/themeLight false true @@ -23,7 +21,7 @@ - - - - - diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index 17f0d6f7..bd2219d4 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -2,31 +2,31 @@ + android:summary="@string/pref_refresh_rate_summary" + android:title="@string/pref_refresh_rate_title" /> \ No newline at end of file