Moved to viewBinding instead of findViewById

This commit is contained in:
Arty Bishop committed 2020-02-29 23:39:02 +00:00
1 parent 7c19bb5b52
commit 38b9feb829
22 files changed
+292 -349

No files matched your search

+4 -1
View File
@@ -50,12 +50,15 @@ android {
kotlinOptions { kotlinOptions {
jvmTarget = "1.8" jvmTarget = "1.8"
} }
viewBinding {
enabled = true
}
} }
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.google.android.material:material:$material" implementation "com.google.android.material:material:$material"
implementation "androidx.appcompat:appcompat:$supportLib" implementation "androidx.appcompat:appcompat:$appCompat"
implementation "androidx.legacy:legacy-support-v4:$supportLib" implementation "androidx.legacy:legacy-support-v4:$supportLib"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayout" implementation "androidx.constraintlayout:constraintlayout:$constraintLayout"
@@ -24,31 +24,34 @@ import android.text.method.LinkMovementMethod
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.rtbishop.look4sat.BuildConfig import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentAboutBinding
class AboutFragment : Fragment() { class AboutFragment : Fragment() {
private lateinit var textVersion: TextView private var _binding: FragmentAboutBinding? = null
private lateinit var textThanks: TextView private val binding get() = _binding!!
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate(R.layout.fragment_about, container, false) _binding = FragmentAboutBinding.inflate(inflater, container, false)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.tvAboutVersion.text =
String.format(getString(R.string.app_version), BuildConfig.VERSION_NAME)
binding.tvAboutMessage.movementMethod = LinkMovementMethod.getInstance()
}
textVersion = view.findViewById(R.id.about_title_version) override fun onDestroyView() {
textThanks = view.findViewById(R.id.about_thanks_to) _binding = null
super.onDestroyView()
textVersion.text = String.format(getString(R.string.app_version), BuildConfig.VERSION_NAME)
textThanks.movementMethod = LinkMovementMethod.getInstance()
} }
} }
@@ -27,15 +27,10 @@ import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController import androidx.navigation.findNavController
@@ -43,9 +38,10 @@ import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.google.android.material.navigation.NavigationView
import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.MainViewModel
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ActivityMainBinding
import com.rtbishop.look4sat.databinding.DrawerHeaderBinding
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@@ -54,22 +50,17 @@ class MainActivity : AppCompatActivity() {
private val permGranted = PackageManager.PERMISSION_GRANTED private val permGranted = PackageManager.PERMISSION_GRANTED
private val githubUrl = "https://github.com/rt-bishop/LookingSat" private val githubUrl = "https://github.com/rt-bishop/LookingSat"
private lateinit var mainBinding: ActivityMainBinding
private lateinit var drawerBinding: DrawerHeaderBinding
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var timerLayout: ConstraintLayout
private lateinit var drawerLayout: DrawerLayout
private lateinit var drawerLat: TextView
private lateinit var drawerLon: TextView
private lateinit var drawerBtnLoc: Button
private lateinit var drawerBtnTle: Button
private lateinit var drawerBtnTrans: Button
private lateinit var drawerBtnGithub: Button
private lateinit var drawerBtnExit: Button
private lateinit var appBarConfig: AppBarConfiguration private lateinit var appBarConfig: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme) setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) mainBinding = ActivityMainBinding.inflate(layoutInflater)
drawerBinding = DrawerHeaderBinding.inflate(layoutInflater, mainBinding.navView, true)
setContentView(mainBinding.root)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java) viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
setupComponents() setupComponents()
setupObservers() setupObservers()
@@ -79,24 +70,13 @@ class MainActivity : AppCompatActivity() {
@SuppressLint("SourceLockedOrientationActivity") @SuppressLint("SourceLockedOrientationActivity")
private fun setupComponents() { private fun setupComponents() {
val navController = findNavController(R.id.nav_host) val navController = findNavController(R.id.nav_host)
val navView: NavigationView = findViewById(R.id.nav_view) val navView = mainBinding.navView
val header = navView.getHeaderView(0) val toolbar = mainBinding.includeAppBar.toolbar
val toolbar: Toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
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)
drawerBtnLoc = header.findViewById(R.id.drawer_btn_loc)
drawerBtnTle = header.findViewById(R.id.drawer_btn_tle)
drawerBtnTrans = header.findViewById(R.id.drawer_btn_trans)
drawerBtnGithub = header.findViewById(R.id.drawer_btn_github)
drawerBtnExit = header.findViewById(R.id.drawer_btn_exit)
appBarConfig = AppBarConfiguration( appBarConfig = AppBarConfiguration(
setOf(R.id.nav_pass_list, R.id.nav_map_view, R.id.nav_settings, R.id.nav_about), setOf(R.id.nav_pass_list, R.id.nav_map_view, R.id.nav_settings, R.id.nav_about),
drawerLayout mainBinding.drawerLayout
) )
setupActionBarWithNavController(navController, appBarConfig) setupActionBarWithNavController(navController, appBarConfig)
@@ -107,7 +87,7 @@ class MainActivity : AppCompatActivity() {
R.id.nav_pass_list -> { R.id.nav_pass_list -> {
this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
toolbar.visibility = View.VISIBLE toolbar.visibility = View.VISIBLE
timerLayout.visibility = View.VISIBLE mainBinding.includeAppBar.toolbarLayout.visibility = View.VISIBLE
} }
R.id.nav_map_view -> { R.id.nav_map_view -> {
this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
@@ -116,7 +96,7 @@ class MainActivity : AppCompatActivity() {
else -> { else -> {
this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
toolbar.visibility = View.VISIBLE toolbar.visibility = View.VISIBLE
timerLayout.visibility = View.GONE mainBinding.includeAppBar.toolbarLayout.visibility = View.GONE
} }
} }
} }
@@ -126,40 +106,45 @@ class MainActivity : AppCompatActivity() {
viewModel.debugMessage.observe(this, Observer { message -> viewModel.debugMessage.observe(this, Observer { message ->
Toast.makeText(this, message, Toast.LENGTH_SHORT).show() Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
when (message) { when (message) {
getString(R.string.update_loc_success) -> drawerBtnLoc.isEnabled = true getString(R.string.update_loc_success) -> drawerBinding.drawerBtnLoc.isEnabled =
getString(R.string.update_tle_success) -> drawerBtnTle.isEnabled = true true
getString(R.string.update_trans_success) -> drawerBtnTrans.isEnabled = true getString(R.string.update_tle_success) -> drawerBinding.drawerBtnTle.isEnabled =
true
getString(R.string.update_trans_success) -> drawerBinding.drawerBtnTrans.isEnabled =
true
getString(R.string.update_failure) -> { getString(R.string.update_failure) -> {
drawerBtnTle.isEnabled = true drawerBinding.drawerBtnTle.isEnabled = true
drawerBtnTrans.isEnabled = true drawerBinding.drawerBtnTrans.isEnabled = true
} }
} }
}) })
viewModel.gsp.observe(this, Observer { gsp -> viewModel.gsp.observe(this, Observer { gsp ->
drawerLat.text = String.format(getString(R.string.pat_location), gsp.latitude) drawerBinding.drawerLatValue.text =
drawerLon.text = String.format(getString(R.string.pat_location), gsp.longitude) String.format(getString(R.string.pat_location), gsp.latitude)
drawerBinding.drawerLonValue.text =
String.format(getString(R.string.pat_location), gsp.longitude)
}) })
} }
private fun setupDrawer() { private fun setupDrawer() {
drawerBtnLoc.setOnClickListener { drawerBinding.drawerBtnLoc.setOnClickListener {
it.isEnabled = false it.isEnabled = false
requestLocationUpdate() requestLocationUpdate()
} }
drawerBtnTle.setOnClickListener { drawerBinding.drawerBtnTle.setOnClickListener {
it.isEnabled = false it.isEnabled = false
viewModel.updateAndSaveTleFile() viewModel.updateAndSaveTleFile()
} }
drawerBtnTrans.setOnClickListener { drawerBinding.drawerBtnTrans.setOnClickListener {
it.isEnabled = false it.isEnabled = false
viewModel.updateTransmittersDatabase() viewModel.updateTransmittersDatabase()
} }
drawerBtnGithub.setOnClickListener { drawerBinding.drawerBtnGithub.setOnClickListener {
val githubIntent = Intent(Intent.ACTION_VIEW, Uri.parse(githubUrl)) val githubIntent = Intent(Intent.ACTION_VIEW, Uri.parse(githubUrl))
startActivity(githubIntent) startActivity(githubIntent)
} }
drawerBtnExit.setOnClickListener { finish() } drawerBinding.drawerBtnExit.setOnClickListener { finish() }
} }
private fun requestLocationUpdate() { private fun requestLocationUpdate() {
@@ -25,8 +25,6 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@@ -36,9 +34,9 @@ import com.github.amsacode.predict4java.GroundStationPosition
import com.github.amsacode.predict4java.Position import com.github.amsacode.predict4java.Position
import com.github.amsacode.predict4java.SatPos import com.github.amsacode.predict4java.SatPos
import com.github.amsacode.predict4java.TLE import com.github.amsacode.predict4java.TLE
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.MainViewModel
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentMapViewBinding
import com.rtbishop.look4sat.predict4kotlin.PassPredictor import com.rtbishop.look4sat.predict4kotlin.PassPredictor
import com.rtbishop.look4sat.repo.SatPass import com.rtbishop.look4sat.repo.SatPass
import java.util.* import java.util.*
@@ -49,15 +47,13 @@ import kotlin.math.abs
class MapViewFragment : Fragment() { class MapViewFragment : Fragment() {
private var _binding: FragmentMapViewBinding? = null
private val binding get() = _binding!!
private lateinit var service: ScheduledExecutorService private lateinit var service: ScheduledExecutorService
private lateinit var mainActivity: MainActivity private lateinit var mainActivity: MainActivity
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var mapFrame: FrameLayout
private lateinit var mapFab: FloatingActionButton
private lateinit var mapView: MapView private lateinit var mapView: MapView
private lateinit var mapLat: TextView
private lateinit var mapLon: TextView
private lateinit var mapRng: TextView
private lateinit var predictor: PassPredictor private lateinit var predictor: PassPredictor
private lateinit var selectedSat: TLE private lateinit var selectedSat: TLE
private lateinit var gsp: GroundStationPosition private lateinit var gsp: GroundStationPosition
@@ -76,23 +72,15 @@ class MapViewFragment : Fragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate(R.layout.fragment_map_view, container, false) _binding = FragmentMapViewBinding.inflate(layoutInflater, container, false)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
findViews(view)
setupComponents() setupComponents()
} }
private fun findViews(view: View) {
mapFrame = view.findViewById(R.id.map_frame)
mapFab = view.findViewById(R.id.map_fab)
mapLat = view.findViewById(R.id.map_lat)
mapLon = view.findViewById(R.id.map_lon)
mapRng = view.findViewById(R.id.map_rng)
}
private fun setupComponents() { private fun setupComponents() {
val delay = viewModel.delay val delay = viewModel.delay
gsp = viewModel.gsp.value ?: GroundStationPosition(0.0, 0.0, 0.0) gsp = viewModel.gsp.value ?: GroundStationPosition(0.0, 0.0, 0.0)
@@ -101,11 +89,11 @@ class MapViewFragment : Fragment() {
if (satPassList.isNotEmpty()) { if (satPassList.isNotEmpty()) {
satPassList = satPassList.distinctBy { it.tle } satPassList = satPassList.distinctBy { it.tle }
satPassList = satPassList.sortedBy { it.tle.name } satPassList = satPassList.sortedBy { it.tle.name }
mapFab.setOnClickListener { showSelectSatDialog(satPassList) } binding.fabMap.setOnClickListener { showSelectSatDialog(satPassList) }
selectedSat = satPassList.first().tle selectedSat = satPassList.first().tle
predictor = satPassList.first().predictor predictor = satPassList.first().predictor
mapView = MapView(mainActivity) mapView = MapView(mainActivity)
mapFrame.addView(mapView) binding.frameMap.addView(mapView)
service.scheduleAtFixedRate( service.scheduleAtFixedRate(
{ mapView.invalidate() }, { mapView.invalidate() },
delay, delay,
@@ -113,7 +101,7 @@ class MapViewFragment : Fragment() {
TimeUnit.MILLISECONDS TimeUnit.MILLISECONDS
) )
} else { } else {
mapFab.setOnClickListener { binding.fabMap.setOnClickListener {
Toast.makeText( Toast.makeText(
mainActivity, mainActivity,
getString(R.string.err_no_sat_selected), getString(R.string.err_no_sat_selected),
@@ -209,9 +197,9 @@ class MapViewFragment : Fragment() {
if (lon > 180f) lon -= 360f if (lon > 180f) lon -= 360f
mapLat.text = String.format(context.getString(R.string.pat_latitude), lat) binding.tvMapLat.text = String.format(context.getString(R.string.pat_latitude), lat)
mapLon.text = String.format(context.getString(R.string.pat_longitude), lon) binding.tvMapLon.text = String.format(context.getString(R.string.pat_longitude), lon)
mapRng.text = String.format(context.getString(R.string.pat_range), rng) binding.tvMapRng.text = String.format(context.getString(R.string.pat_range), rng)
} }
private fun drawGroundTrack( private fun drawGroundTrack(
@@ -313,4 +301,9 @@ class MapViewFragment : Fragment() {
return value * 180 / Math.PI return value * 180 / Math.PI
} }
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -29,18 +29,15 @@ import android.widget.ImageButton
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SimpleItemAnimator import androidx.recyclerview.widget.SimpleItemAnimator
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.github.amsacode.predict4java.TLE import com.github.amsacode.predict4java.TLE
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.MainViewModel
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentPassListBinding
import com.rtbishop.look4sat.repo.SatEntry import com.rtbishop.look4sat.repo.SatEntry
import com.rtbishop.look4sat.repo.SatPass import com.rtbishop.look4sat.repo.SatPass
import com.rtbishop.look4sat.ui.adapters.SatPassAdapter import com.rtbishop.look4sat.ui.adapters.SatPassAdapter
@@ -49,15 +46,14 @@ import java.util.concurrent.TimeUnit
class PassListFragment : Fragment() { class PassListFragment : Fragment() {
private var _binding: FragmentPassListBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var satPassRecycler: RecyclerView
private lateinit var satPassAdapter: SatPassAdapter private lateinit var satPassAdapter: SatPassAdapter
private lateinit var btnPassPrefs: ImageButton private lateinit var btnPassPrefs: ImageButton
private lateinit var passListFab: FloatingActionButton
private lateinit var aosTimer: CountDownTimer private lateinit var aosTimer: CountDownTimer
private lateinit var aosTimerText: TextView private lateinit var aosTimerText: TextView
private lateinit var swipeLayout: SwipeRefreshLayout
private lateinit var infoLayout: ConstraintLayout
private lateinit var mainActivity: MainActivity private lateinit var mainActivity: MainActivity
private lateinit var satPassList: MutableList<SatPass> private lateinit var satPassList: MutableList<SatPass>
private var isTimerSet: Boolean = false private var isTimerSet: Boolean = false
@@ -75,27 +71,20 @@ class PassListFragment : Fragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate(R.layout.fragment_pass_list, container, false) _binding = FragmentPassListBinding.inflate(layoutInflater, container, false)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
findViews(view) aosTimerText = mainActivity.findViewById(R.id.toolbar_timer)
btnPassPrefs = mainActivity.findViewById(R.id.toolbar_filter)
setupComponents() setupComponents()
setupObservers() setupObservers()
} }
private fun findViews(view: View) {
aosTimerText = mainActivity.findViewById(R.id.toolbar_timer)
btnPassPrefs = mainActivity.findViewById(R.id.toolbar_filter)
swipeLayout = view.findViewById(R.id.pass_list_refresh)
infoLayout = view.findViewById(R.id.pass_info_layout)
satPassRecycler = view.findViewById(R.id.pass_list_recycler)
passListFab = view.findViewById(R.id.pass_list_fab)
}
private fun setupComponents() { private fun setupComponents() {
satPassRecycler.apply { binding.recPassList.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = LinearLayoutManager(mainActivity)
adapter = satPassAdapter adapter = satPassAdapter
isVerticalScrollBarEnabled = false isVerticalScrollBarEnabled = false
@@ -104,13 +93,13 @@ class PassListFragment : Fragment() {
satPassAdapter.setList(satPassList) satPassAdapter.setList(satPassList)
setTimer() setTimer()
swipeLayout.setProgressBackgroundColorSchemeResource(R.color.themeAccent) binding.refLayoutPassList.setProgressBackgroundColorSchemeResource(R.color.themeAccent)
swipeLayout.setColorSchemeResources(R.color.backgroundDark) binding.refLayoutPassList.setColorSchemeResources(R.color.backgroundDark)
swipeLayout.setOnRefreshListener { calculatePasses() } binding.refLayoutPassList.setOnRefreshListener { calculatePasses() }
btnPassPrefs.setOnClickListener { btnPassPrefs.setOnClickListener {
showSatPassPrefsDialog(viewModel.hoursAhead, viewModel.minEl) showSatPassPrefsDialog(viewModel.hoursAhead, viewModel.minEl)
} }
passListFab.setOnClickListener { binding.fabSatSelect.setOnClickListener {
showSelectSatDialog(viewModel.tleMainList, viewModel.tleSelection) showSelectSatDialog(viewModel.tleMainList, viewModel.tleSelection)
} }
} }
@@ -120,19 +109,19 @@ class PassListFragment : Fragment() {
satPassList = it satPassList = it
satPassAdapter.setList(satPassList) satPassAdapter.setList(satPassList)
if (satPassList.isNotEmpty()) { if (satPassList.isNotEmpty()) {
infoLayout.visibility = View.INVISIBLE binding.layoutInfo.visibility = View.INVISIBLE
satPassRecycler.visibility = View.VISIBLE binding.recPassList.visibility = View.VISIBLE
} else { } else {
infoLayout.visibility = View.VISIBLE binding.layoutInfo.visibility = View.VISIBLE
satPassRecycler.visibility = View.INVISIBLE binding.recPassList.visibility = View.INVISIBLE
} }
setTimer() setTimer()
swipeLayout.isRefreshing = false binding.refLayoutPassList.isRefreshing = false
}) })
} }
private fun calculatePasses() { private fun calculatePasses() {
swipeLayout.isRefreshing = true binding.refLayoutPassList.isRefreshing = true
viewModel.getPasses() viewModel.getPasses()
} }
@@ -278,4 +267,9 @@ class PassListFragment : Fragment() {
if (resetToNull) aosTimerText.text = if (resetToNull) aosTimerText.text =
String.format(getString(R.string.pat_timer), 0, 0, 0) String.format(getString(R.string.pat_timer), 0, 0, 0)
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -27,18 +27,16 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.amsacode.predict4java.SatPos import com.github.amsacode.predict4java.SatPos
import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.MainViewModel
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentPolarViewBinding
import com.rtbishop.look4sat.repo.SatPass import com.rtbishop.look4sat.repo.SatPass
import com.rtbishop.look4sat.ui.adapters.TransmitterAdapter import com.rtbishop.look4sat.ui.adapters.TransmitterAdapter
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -53,17 +51,13 @@ class PolarViewFragment : Fragment() {
private val service = Executors.newSingleThreadScheduledExecutor() private val service = Executors.newSingleThreadScheduledExecutor()
private val args: PolarViewFragmentArgs by navArgs() private val args: PolarViewFragmentArgs by navArgs()
private var _binding: FragmentPolarViewBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var satPass: SatPass private lateinit var satPass: SatPass
private lateinit var polarView: PolarView private lateinit var polarView: PolarView
private lateinit var polarViewFrame: FrameLayout
private lateinit var transRecycler: RecyclerView
private lateinit var transmitterAdapter: TransmitterAdapter 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 private lateinit var mainActivity: MainActivity
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -77,27 +71,20 @@ class PolarViewFragment : Fragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate(R.layout.fragment_polar_view, container, false) _binding = FragmentPolarViewBinding.inflate(layoutInflater, container, false)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
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)
viewModel.satPassList.value?.let { viewModel.satPassList.value?.let {
val refreshRate = viewModel.delay val refreshRate = viewModel.delay
satPass = it[args.satPassIndex] satPass = it[args.satPassIndex]
mainActivity.supportActionBar?.title = satPass.tle.name mainActivity.supportActionBar?.title = satPass.tle.name
polarView = PolarView(mainActivity, refreshRate) polarView = PolarView(mainActivity, refreshRate)
polarViewFrame.addView(polarView) binding.framePolar.addView(polarView)
service.scheduleAtFixedRate( service.scheduleAtFixedRate(
{ polarView.invalidate() }, { polarView.invalidate() },
refreshRate, refreshRate,
@@ -111,7 +98,7 @@ class PolarViewFragment : Fragment() {
private fun setupTransRecycler() { private fun setupTransRecycler() {
transmitterAdapter = TransmitterAdapter() transmitterAdapter = TransmitterAdapter()
transRecycler.apply { binding.recPolar.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = LinearLayoutManager(mainActivity)
adapter = transmitterAdapter adapter = transmitterAdapter
} }
@@ -121,8 +108,8 @@ class PolarViewFragment : Fragment() {
transmitterAdapter.setList(transList) transmitterAdapter.setList(transList)
transmitterAdapter.notifyDataSetChanged() transmitterAdapter.notifyDataSetChanged()
} else { } else {
transRecycler.visibility = View.INVISIBLE binding.recPolar.visibility = View.INVISIBLE
noTransFound.visibility = View.VISIBLE binding.tvPolarNoTrans.visibility = View.VISIBLE
} }
} }
} }
@@ -178,13 +165,13 @@ class PolarViewFragment : Fragment() {
private fun setPassText() { private fun setPassText() {
satPos = satPass.predictor.getSatPos(Date()) satPos = satPass.predictor.getSatPos(Date())
polarAzimuth.text = binding.tvPolarAz.text =
String.format(context.getString(R.string.pat_azimuth), rad2Deg(satPos.azimuth)) String.format(context.getString(R.string.pat_azimuth), rad2Deg(satPos.azimuth))
polarElevation.text = binding.tvPolarEl.text =
String.format(context.getString(R.string.pat_elevation), rad2Deg(satPos.elevation)) String.format(context.getString(R.string.pat_elevation), rad2Deg(satPos.elevation))
polarRange.text = binding.tvPolarRng.text =
String.format(context.getString(R.string.pat_range), satPos.range) String.format(context.getString(R.string.pat_range), satPos.range)
polarAltitude.text = binding.tvPolarAlt.text =
String.format(context.getString(R.string.pat_altitude), satPos.altitude) String.format(context.getString(R.string.pat_altitude), satPos.altitude)
} }
@@ -266,4 +253,9 @@ class PolarViewFragment : Fragment() {
return value * 180 / Math.PI return value * 180 / Math.PI
} }
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -24,33 +24,30 @@ import android.os.Bundle
import android.view.ViewGroup import android.view.ViewGroup
import android.view.Window import android.view.Window
import android.widget.SearchView import android.widget.SearchView
import android.widget.TextView
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import com.rtbishop.look4sat.databinding.DialogSatEntryBinding
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.repo.SatEntry import com.rtbishop.look4sat.repo.SatEntry
import com.rtbishop.look4sat.ui.adapters.SatEntryAdapter import com.rtbishop.look4sat.ui.adapters.SatEntryAdapter
import java.util.* import java.util.*
class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener { class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener {
private lateinit var searchView: SearchView
private lateinit var recyclerView: RecyclerView
private lateinit var dialogBtnPositive: TextView
private lateinit var dialogBtnNegative: TextView
private lateinit var dialogBtnNeutral: TextView
private lateinit var satEntryAdapter: SatEntryAdapter private lateinit var satEntryAdapter: SatEntryAdapter
private lateinit var entriesListener: EntriesSubmitListener private lateinit var entriesListener: EntriesSubmitListener
private var _binding: DialogSatEntryBinding? = null
private val binding get() = _binding!!
private var entriesList = mutableListOf<SatEntry>() private var entriesList = mutableListOf<SatEntry>()
private var selectionList = mutableListOf<Int>() private var selectionList = mutableListOf<Int>()
private var selectAllToggle = true private var selectAllToggle = true
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
_binding = DialogSatEntryBinding.inflate(requireActivity().layoutInflater)
val satEntryDialog = Dialog(requireActivity()).apply { val satEntryDialog = Dialog(requireActivity()).apply {
window?.requestFeature(Window.FEATURE_NO_TITLE) window?.requestFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_sat_entry) setContentView(binding.root)
window?.setLayout( window?.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT ViewGroup.LayoutParams.MATCH_PARENT
@@ -60,20 +57,21 @@ class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener
entriesList = checkSelectedEntries(entriesList, selectionList) entriesList = checkSelectedEntries(entriesList, selectionList)
satEntryAdapter = SatEntryAdapter(entriesList) satEntryAdapter = SatEntryAdapter(entriesList)
findViews(satEntryDialog) binding.dialogSearch.apply {
setListeners()
searchView.apply {
setOnQueryTextListener(this@SatEntryDialog) setOnQueryTextListener(this@SatEntryDialog)
onActionViewExpanded() onActionViewExpanded()
clearFocus() clearFocus()
} }
recyclerView.apply { binding.dialogRecycler.apply {
layoutManager = LinearLayoutManager(activity) layoutManager = LinearLayoutManager(activity)
adapter = satEntryAdapter adapter = satEntryAdapter
} }
binding.dialogBtnPositive.setOnClickListener { onPositiveClicked() }
binding.dialogBtnNegative.setOnClickListener { onNegativeClicked() }
binding.dialogBtnNeutral.setOnClickListener { onNeutralClicked() }
return satEntryDialog return satEntryDialog
} }
@@ -93,20 +91,6 @@ class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener
return this return this
} }
private fun findViews(dialog: Dialog) {
searchView = dialog.findViewById(R.id.dialog_search)
recyclerView = dialog.findViewById(R.id.dialog_recycler)
dialogBtnPositive = dialog.findViewById(R.id.dialog_btn_positive)
dialogBtnNegative = dialog.findViewById(R.id.dialog_btn_negative)
dialogBtnNeutral = dialog.findViewById(R.id.dialog_btn_neutral)
}
private fun setListeners() {
dialogBtnPositive.setOnClickListener { onPositiveClicked() }
dialogBtnNegative.setOnClickListener { onNegativeClicked() }
dialogBtnNeutral.setOnClickListener { onNeutralClicked() }
}
private fun checkSelectedEntries(entries: MutableList<SatEntry>, selection: MutableList<Int>) private fun checkSelectedEntries(entries: MutableList<SatEntry>, selection: MutableList<Int>)
: MutableList<SatEntry> { : MutableList<SatEntry> {
selection.forEach { entries[it].isSelected = true } selection.forEach { entries[it].isSelected = true }
@@ -163,4 +147,9 @@ class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener
interface EntriesSubmitListener { interface EntriesSubmitListener {
fun onEntriesSubmit(list: MutableList<Int>) fun onEntriesSubmit(list: MutableList<Int>)
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -22,19 +22,17 @@ package com.rtbishop.look4sat.ui.adapters
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.CheckBox
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.ItemSatEntryBinding
import com.rtbishop.look4sat.repo.SatEntry import com.rtbishop.look4sat.repo.SatEntry
internal class SatEntryAdapter(private var entriesList: MutableList<SatEntry>) : internal class SatEntryAdapter(private var entriesList: MutableList<SatEntry>) :
RecyclerView.Adapter<SatEntryAdapter.SatEntryHolder>() { RecyclerView.Adapter<SatEntryAdapter.SatEntryHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder {
val view = LayoutInflater val binding = ItemSatEntryBinding
.from(parent.context) .inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.sat_entry_item, parent, false) return SatEntryHolder(binding.root, binding)
return SatEntryHolder(view)
} }
override fun onBindViewHolder(holder: SatEntryHolder, position: Int) { override fun onBindViewHolder(holder: SatEntryHolder, position: Int) {
@@ -50,13 +48,13 @@ internal class SatEntryAdapter(private var entriesList: MutableList<SatEntry>) :
notifyDataSetChanged() notifyDataSetChanged()
} }
internal inner class SatEntryHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { internal inner class SatEntryHolder(itemView: View, private val binding: ItemSatEntryBinding) :
private val satEntryItem: CheckBox = itemView.findViewById(R.id.sat_entry_item) RecyclerView.ViewHolder(itemView) {
fun bind(satEntry: SatEntry) { fun bind(satEntry: SatEntry) {
satEntryItem.text = satEntry.name binding.satEntryCheckbox.text = satEntry.name
satEntryItem.isChecked = satEntry.isSelected binding.satEntryCheckbox.isChecked = satEntry.isSelected
itemView.setOnClickListener { satEntry.isSelected = satEntryItem.isChecked } itemView.setOnClickListener { satEntry.isSelected = binding.satEntryCheckbox.isChecked }
} }
} }
} }
@@ -23,13 +23,12 @@ import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.MainViewModel
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ItemPassGeoBinding
import com.rtbishop.look4sat.databinding.ItemPassLeoBinding
import com.rtbishop.look4sat.repo.SatPass import com.rtbishop.look4sat.repo.SatPass
import com.rtbishop.look4sat.ui.PassListFragmentDirections import com.rtbishop.look4sat.ui.PassListFragmentDirections
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@@ -80,60 +79,48 @@ class SatPassAdapter(val viewModel: MainViewModel) :
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == 0) { return if (viewType == 0) {
val itemView = LayoutInflater val bindingLeo = ItemPassLeoBinding
.from(parent.context) .inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.card_pass, parent, false) SatPassLeoHolder(bindingLeo.root, bindingLeo)
return SatPassHolder(itemView)
} else { } else {
val itemView = LayoutInflater val bindingGeo = ItemPassGeoBinding
.from(parent.context) .inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.card_pass_geo, parent, false) SatPassGeoHolder(bindingGeo.root, bindingGeo)
SatPassGeoHolder(itemView)
} }
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder.itemViewType == 0) { if (holder.itemViewType == 0) {
(holder as SatPassHolder).bind(satPassList[position]) (holder as SatPassLeoHolder).bind(satPassList[position])
} else { } else {
(holder as SatPassGeoHolder).bind(satPassList[position]) (holder as SatPassGeoHolder).bind(satPassList[position])
} }
} }
inner class SatPassHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class SatPassLeoHolder(itemView: View, private val binding: ItemPassLeoBinding) :
RecyclerView.ViewHolder(itemView) {
private val context: Context = itemView.context
private val passImg = itemView.findViewById<ImageView>(R.id.pass_img)
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 aosAz = itemView.findViewById<TextView>(R.id.pass_aosAz)
private val losAz = itemView.findViewById<TextView>(R.id.pass_losAz)
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) { fun bind(satPass: SatPass) {
val context: Context = itemView.context
if (satPass.active) binding.passLeoImg.setImageResource(R.drawable.ic_pass_active)
else binding.passLeoImg.setImageResource(R.drawable.ic_pass_inactive)
if (satPass.active) passImg.setImageResource(R.drawable.ic_pass_active) binding.passLeoSatName.text = satPass.tle.name
else passImg.setImageResource(R.drawable.ic_pass_inactive) binding.passLeoSatId.text =
satName.text = satPass.tle.name
satId.text =
String.format(context.getString(R.string.pass_satId), satPass.tle.catnum) String.format(context.getString(R.string.pass_satId), satPass.tle.catnum)
maxEl.text = binding.passLeoMaxEl.text =
String.format(context.getString(R.string.pass_maxEl), satPass.pass.maxEl) String.format(context.getString(R.string.pass_maxEl), satPass.pass.maxEl)
aosAz.text = binding.passLeoAosAz.text =
String.format(context.getString(R.string.pass_aos_az), satPass.pass.aosAzimuth) String.format(context.getString(R.string.pass_aos_az), satPass.pass.aosAzimuth)
losAz.text = binding.passLeoLosAz.text =
String.format(context.getString(R.string.pass_los_az), satPass.pass.losAzimuth) String.format(context.getString(R.string.pass_los_az), satPass.pass.losAzimuth)
aosTime.text = binding.passLeoAosTime.text =
SimpleDateFormat(context.getString(R.string.pass_dateTime), Locale.getDefault()) SimpleDateFormat(context.getString(R.string.pass_dateTime), Locale.getDefault())
.format(satPass.pass.startTime) .format(satPass.pass.startTime)
losTime.text = binding.passLeoLosTime.text =
SimpleDateFormat(context.getString(R.string.pass_dateTime), Locale.getDefault()) SimpleDateFormat(context.getString(R.string.pass_dateTime), Locale.getDefault())
.format(satPass.pass.endTime) .format(satPass.pass.endTime)
progressBar.progress = satPass.progress binding.passLeoProgress.progress = satPass.progress
itemView.setOnClickListener { itemView.setOnClickListener {
viewModel.satPassList.value?.let { viewModel.satPassList.value?.let {
@@ -145,22 +132,19 @@ class SatPassAdapter(val viewModel: MainViewModel) :
} }
} }
inner class SatPassGeoHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class SatPassGeoHolder(itemView: View, private val binding: ItemPassGeoBinding) :
RecyclerView.ViewHolder(itemView) {
private val context: Context = itemView.context
private val satName = itemView.findViewById<TextView>(R.id.pass_geo_name)
private val satId = itemView.findViewById<TextView>(R.id.pass_geo_id)
private val satAz = itemView.findViewById<TextView>(R.id.pass_geo_az)
private val satEl = itemView.findViewById<TextView>(R.id.pass_geo_el)
fun bind(satPass: SatPass) { fun bind(satPass: SatPass) {
val context: Context = itemView.context
val satPos = satPass.predictor.getSatPos(satPass.pass.startTime) val satPos = satPass.predictor.getSatPos(satPass.pass.startTime)
val azimuth = satPos.azimuth * 180 / Math.PI val azimuth = satPos.azimuth * 180 / Math.PI
satName.text = satPass.tle.name binding.passGeoName.text = satPass.tle.name
satId.text = String.format(context.getString(R.string.pass_satId), satPass.tle.catnum) binding.passGeoId.text =
satAz.text = String.format(context.getString(R.string.pat_azimuth), azimuth) String.format(context.getString(R.string.pass_satId), satPass.tle.catnum)
satEl.text = binding.passGeoAz.text = String.format(context.getString(R.string.pat_azimuth), azimuth)
binding.passGeoEl.text =
String.format(context.getString(R.string.pat_elevation), satPass.pass.maxEl) String.format(context.getString(R.string.pat_elevation), satPass.pass.maxEl)
itemView.setOnClickListener { itemView.setOnClickListener {
@@ -23,9 +23,9 @@ import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ItemTransmitterBinding
import com.rtbishop.look4sat.repo.Transmitter import com.rtbishop.look4sat.repo.Transmitter
class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHolder>() { class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHolder>() {
@@ -41,72 +41,69 @@ class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHo
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransmitterHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransmitterHolder {
val itemView = LayoutInflater val binding = ItemTransmitterBinding
.from(parent.context) .inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.card_trans, parent, false) return TransmitterHolder(binding.root, binding)
return TransmitterHolder(itemView)
} }
override fun onBindViewHolder(holder: TransmitterHolder, position: Int) { override fun onBindViewHolder(holder: TransmitterHolder, position: Int) {
holder.bind(transmittersList[position]) holder.bind(transmittersList[position])
} }
inner class TransmitterHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { inner class TransmitterHolder(itemView: View, private val binding: ItemTransmitterBinding) :
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) { fun bind(transmitter: Transmitter) {
description.text = transmitter.description val context: Context = itemView.context
val freqDivider = 1000000f
binding.transDescription.text = transmitter.description
if (transmitter.downlinkLow != null && transmitter.downlinkHigh == null) { if (transmitter.downlinkLow != null && transmitter.downlinkHigh == null) {
downlink.text = String.format( binding.transDownlink.text = String
context.getString(R.string.trans_down_low), .format(
transmitter.downlinkLow / freqDivider context.getString(R.string.trans_down_low),
) transmitter.downlinkLow / freqDivider
)
} else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) { } else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) {
downlink.text = String.format( binding.transDownlink.text = String
context.getString(R.string.trans_down_lowHigh), .format(
transmitter.downlinkLow / freqDivider, context.getString(R.string.trans_down_lowHigh),
transmitter.downlinkHigh / freqDivider transmitter.downlinkLow / freqDivider,
) transmitter.downlinkHigh / freqDivider
)
} else { } else {
downlink.text = context.getString(R.string.no_downlink) binding.transDownlink.text = context.getString(R.string.no_downlink)
} }
if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) { if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) {
uplink.text = String.format( binding.transUplink.text = String.format(
context.getString(R.string.trans_up_low), context.getString(R.string.trans_up_low),
transmitter.uplinkLow / freqDivider transmitter.uplinkLow / freqDivider
) )
} else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) { } else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) {
uplink.text = String.format( binding.transUplink.text = String.format(
context.getString(R.string.trans_up_lowHigh), context.getString(R.string.trans_up_lowHigh),
transmitter.uplinkLow / freqDivider, transmitter.uplinkLow / freqDivider,
transmitter.uplinkHigh / freqDivider transmitter.uplinkHigh / freqDivider
) )
} else { } else {
uplink.text = context.getString(R.string.no_uplink) binding.transUplink.text = context.getString(R.string.no_uplink)
} }
if (transmitter.mode != null) { if (transmitter.mode != null) {
mode.text = binding.transMode.text =
String.format(context.getString(R.string.trans_mode), transmitter.mode) String.format(context.getString(R.string.trans_mode), transmitter.mode)
} else { } else {
mode.text = context.getString(R.string.no_mode) binding.transMode.text = context.getString(R.string.no_mode)
} }
if (transmitter.isInverted) { if (transmitter.isInverted) {
inverted.text = String.format( binding.transInverted.text = String.format(
context.getString(R.string.trans_inverted), context.getString(R.string.trans_inverted),
context.getString(R.string.btn_yes) context.getString(R.string.btn_yes)
) )
} else { } else {
inverted.text = String.format( binding.transInverted.text = String.format(
context.getString(R.string.trans_inverted), context.getString(R.string.trans_inverted),
context.getString(R.string.btn_no) context.getString(R.string.btn_no)
) )
@@ -27,6 +27,7 @@
tools:openDrawer="start"> tools:openDrawer="start">
<include <include
android:id="@+id/include_app_bar"
layout="@layout/app_bar_main" layout="@layout/app_bar_main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
+3 -1
View File
@@ -64,6 +64,8 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" /> <include
android:id="@+id/include_main_content"
layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+7 -6
View File
@@ -20,6 +20,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/ic_launcher_background" android:background="@drawable/ic_launcher_background"
@@ -86,7 +87,7 @@
android:text="@string/pat_location" android:text="@string/pat_location"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.1" app:layout_constraintHorizontal_bias="0.1"
app:layout_constraintStart_toEndOf="@+id/barrier" app:layout_constraintStart_toEndOf="@+id/mainBarrier"
app:layout_constraintTop_toBottomOf="@+id/drawer_lat_value" /> app:layout_constraintTop_toBottomOf="@+id/drawer_lat_value" />
<androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton
@@ -131,14 +132,14 @@
android:drawableEnd="@drawable/ic_goto_github" android:drawableEnd="@drawable/ic_goto_github"
android:text="@string/goto_github" android:text="@string/goto_github"
app:layout_constraintBottom_toTopOf="@+id/guidelineBottom" app:layout_constraintBottom_toTopOf="@+id/guidelineBottom"
app:layout_constraintEnd_toStartOf="@+id/guideline_center" app:layout_constraintEnd_toStartOf="@+id/guidelineCenter"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="@+id/guidelineLeft" app:layout_constraintStart_toStartOf="@+id/guidelineLeft"
app:layout_constraintTop_toBottomOf="@+id/drawer_btn_trans" /> app:layout_constraintTop_toBottomOf="@+id/drawer_btn_trans" />
<androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton
android:id="@+id/drawer_btn_exit" android:id="@+id/drawerBtnExit"
style="@style/DrawerHeader.Button" style="@style/DrawerHeader.Button"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_marginStart="1dp" android:layout_marginStart="1dp"
@@ -147,17 +148,17 @@
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_btn_github" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_btn_github"
app:layout_constraintEnd_toStartOf="@+id/guidelineRight" app:layout_constraintEnd_toStartOf="@+id/guidelineRight"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/guideline_center" /> app:layout_constraintStart_toStartOf="@+id/guidelineCenter" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_center" android:id="@+id/guidelineCenter"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" /> app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Barrier <androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier" android:id="@+id/mainBarrier"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="end" app:barrierDirection="end"
+16 -16
View File
@@ -29,19 +29,19 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/about_title" android:id="@+id/tv_about_title"
style="@style/AboutTitle" style="@style/AboutTitle"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:text="@string/app_name" android:text="@string/app_name"
app:layout_constraintBottom_toBottomOf="@+id/about_title_img" app:layout_constraintBottom_toBottomOf="@+id/img_about"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/about_title_img" app:layout_constraintStart_toEndOf="@+id/img_about"
app:layout_constraintTop_toTopOf="@+id/about_title_img" /> app:layout_constraintTop_toTopOf="@+id/img_about" />
<ImageView <ImageView
android:id="@+id/about_title_img" android:id="@+id/img_about"
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="42dp" android:layout_height="42dp"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
@@ -49,14 +49,14 @@
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
android:src="@drawable/ic_sputnik" android:src="@drawable/ic_sputnik"
app:layout_constraintEnd_toStartOf="@+id/about_title" app:layout_constraintEnd_toStartOf="@+id/tv_about_title"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/about_title_version" android:id="@+id/tv_about_version"
style="@style/AboutSubtitle" style="@style/AboutSubtitle"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@@ -64,10 +64,10 @@
android:text="@string/app_version" android:text="@string/app_version"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/about_title" /> app:layout_constraintTop_toBottomOf="@+id/tv_about_title" />
<TextView <TextView
android:id="@+id/about_subtitle" android:id="@+id/tv_about_subtitle"
style="@style/AboutSubtitle" style="@style/AboutSubtitle"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@@ -75,19 +75,19 @@
android:text="@string/about_subtitle" android:text="@string/about_subtitle"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/about_title_version" /> app:layout_constraintTop_toBottomOf="@+id/tv_about_version" />
<TextView <TextView
android:id="@+id/about_thanks" android:id="@+id/tv_about_thanks"
style="@style/AboutSubtitle" style="@style/AboutSubtitle"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/about_thanks_to" android:text="@string/about_thanks_to"
app:layout_constraintEnd_toEndOf="@+id/about_subtitle" app:layout_constraintEnd_toEndOf="@+id/tv_about_subtitle"
app:layout_constraintStart_toStartOf="@+id/about_subtitle" app:layout_constraintStart_toStartOf="@+id/tv_about_subtitle"
app:layout_constraintTop_toBottomOf="@+id/about_subtitle" /> app:layout_constraintTop_toBottomOf="@+id/tv_about_subtitle" />
<TextView <TextView
android:id="@+id/about_thanks_to" android:id="@+id/tv_about_message"
style="@style/AboutRegular" style="@style/AboutRegular"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
@@ -97,7 +97,7 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/about_thanks" /> app:layout_constraintTop_toBottomOf="@+id/tv_about_thanks" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView> </ScrollView>
@@ -25,7 +25,7 @@
tools:context=".ui.MapViewFragment"> tools:context=".ui.MapViewFragment">
<FrameLayout <FrameLayout
android:id="@+id/map_frame" android:id="@+id/frameMap"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/worldmap_bg_dark" android:background="@drawable/worldmap_bg_dark"
@@ -35,7 +35,7 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/map_fab" android:id="@+id/fabMap"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|start" android:layout_gravity="bottom|start"
@@ -46,7 +46,7 @@
app:srcCompat="@drawable/ic_sat_asc_right" /> app:srcCompat="@drawable/ic_sat_asc_right" />
<TextView <TextView
android:id="@+id/map_lat" android:id="@+id/tvMapLat"
style="@style/MapText" style="@style/MapText"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
@@ -55,7 +55,7 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/map_lon" android:id="@+id/tvMapLon"
style="@style/MapText" style="@style/MapText"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
@@ -64,7 +64,7 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/map_rng" android:id="@+id/tvMapRng"
style="@style/MapText" style="@style/MapText"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
+13 -13
View File
@@ -19,7 +19,7 @@
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/pass_list_refresh" android:id="@+id/refLayoutPassList"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@@ -28,7 +28,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/pass_list_recycler" android:id="@+id/recPassList"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
@@ -41,7 +41,7 @@
</androidx.recyclerview.widget.RecyclerView> </androidx.recyclerview.widget.RecyclerView>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/pass_info_layout" android:id="@+id/layoutInfo"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="visible" android:visibility="visible"
@@ -51,7 +51,7 @@
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView <ImageView
android:id="@+id/info_swipe_img" android:id="@+id/imgInfoSwipe"
android:layout_width="36dp" android:layout_width="36dp"
android:layout_height="36dp" android:layout_height="36dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
@@ -61,7 +61,7 @@
app:srcCompat="@drawable/ic_arrow_swipe" /> app:srcCompat="@drawable/ic_arrow_swipe" />
<TextView <TextView
android:id="@+id/info_swipe_text" android:id="@+id/tvInfoSwipe"
style="@style/PassInfoText" style="@style/PassInfoText"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -70,10 +70,10 @@
android:text="@string/info_swipe_text" android:text="@string/info_swipe_text"
app:layout_constraintEnd_toStartOf="@+id/guideRight" app:layout_constraintEnd_toStartOf="@+id/guideRight"
app:layout_constraintStart_toStartOf="@+id/guideLeft" app:layout_constraintStart_toStartOf="@+id/guideLeft"
app:layout_constraintTop_toBottomOf="@+id/info_swipe_img" /> app:layout_constraintTop_toBottomOf="@+id/imgInfoSwipe" />
<ImageView <ImageView
android:id="@+id/info_img_sputnik" android:id="@+id/imgInfoSputnik"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
@@ -81,22 +81,22 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toTopOf="@+id/info_main_text" app:layout_constraintBottom_toTopOf="@+id/tvInfoMain"
app:layout_constraintDimensionRatio="1:1" app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toStartOf="@+id/guideRight" app:layout_constraintEnd_toStartOf="@+id/guideRight"
app:layout_constraintStart_toStartOf="@+id/guideLeft" app:layout_constraintStart_toStartOf="@+id/guideLeft"
app:layout_constraintTop_toBottomOf="@+id/info_swipe_text" app:layout_constraintTop_toBottomOf="@+id/tvInfoSwipe"
app:layout_constraintVertical_chainStyle="packed" app:layout_constraintVertical_chainStyle="packed"
app:srcCompat="@drawable/ic_sputnik" /> app:srcCompat="@drawable/ic_sputnik" />
<TextView <TextView
android:id="@+id/info_main_text" android:id="@+id/tvInfoMain"
style="@style/PassInfoText" style="@style/PassInfoText"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:text="@string/info_main_text" android:text="@string/info_main_text"
app:layout_constraintBottom_toTopOf="@+id/info_select_text" app:layout_constraintBottom_toTopOf="@+id/tvSatSelect"
app:layout_constraintEnd_toStartOf="@+id/guideRight" app:layout_constraintEnd_toStartOf="@+id/guideRight"
app:layout_constraintStart_toStartOf="@+id/guideLeft" app:layout_constraintStart_toStartOf="@+id/guideLeft"
app:layout_constraintTop_toTopOf="@+id/guideCenter" app:layout_constraintTop_toTopOf="@+id/guideCenter"
@@ -104,7 +104,7 @@
app:layout_constraintVertical_chainStyle="spread" /> app:layout_constraintVertical_chainStyle="spread" />
<TextView <TextView
android:id="@+id/info_select_text" android:id="@+id/tvSatSelect"
style="@style/PassInfoText" style="@style/PassInfoText"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -152,7 +152,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/pass_list_fab" android:id="@+id/fabSatSelect"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
+17 -17
View File
@@ -25,7 +25,7 @@
tools:context=".ui.PolarViewFragment"> tools:context=".ui.PolarViewFragment">
<FrameLayout <FrameLayout
android:id="@+id/polar_view_frame" android:id="@+id/frame_polar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1" app:layout_constraintDimensionRatio="1:1"
@@ -34,49 +34,49 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/polar_azimuth" android:id="@+id/tv_polar_az"
style="@style/PolarViewText" style="@style/PolarViewText"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:text="@string/pat_azimuth" android:text="@string/pat_azimuth"
app:layout_constraintStart_toStartOf="@+id/polar_view_frame" app:layout_constraintStart_toStartOf="@+id/frame_polar"
app:layout_constraintTop_toTopOf="@+id/polar_view_frame" /> app:layout_constraintTop_toTopOf="@+id/frame_polar" />
<TextView <TextView
android:id="@+id/polar_elevation" android:id="@+id/tv_polar_el"
style="@style/PolarViewText" style="@style/PolarViewText"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:text="@string/pat_elevation" android:text="@string/pat_elevation"
app:layout_constraintEnd_toEndOf="@+id/polar_view_frame" app:layout_constraintEnd_toEndOf="@+id/frame_polar"
app:layout_constraintTop_toTopOf="@+id/polar_view_frame" /> app:layout_constraintTop_toTopOf="@+id/frame_polar" />
<TextView <TextView
android:id="@+id/polar_altitude" android:id="@+id/tv_polar_alt"
style="@style/PolarViewText" style="@style/PolarViewText"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:text="@string/pat_altitude" android:text="@string/pat_altitude"
app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame" app:layout_constraintBottom_toBottomOf="@+id/frame_polar"
app:layout_constraintStart_toStartOf="@+id/polar_view_frame" /> app:layout_constraintStart_toStartOf="@+id/frame_polar" />
<TextView <TextView
android:id="@+id/polar_range" android:id="@+id/tv_polar_rng"
style="@style/PolarViewText" style="@style/PolarViewText"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:text="@string/pat_range" android:text="@string/pat_range"
app:layout_constraintBottom_toBottomOf="@+id/polar_view_frame" app:layout_constraintBottom_toBottomOf="@+id/frame_polar"
app:layout_constraintEnd_toEndOf="@+id/polar_view_frame" /> app:layout_constraintEnd_toEndOf="@+id/frame_polar" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/polar_recycler" android:id="@+id/rec_polar"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:paddingBottom="4dp" android:paddingBottom="4dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" /> app:layout_constraintTop_toBottomOf="@+id/frame_polar" />
<TextView <TextView
android:id="@+id/polar_no_trans" android:id="@+id/tv_polar_noTrans"
style="@style/PolarViewText" style="@style/PolarViewText"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@@ -86,5 +86,5 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/polar_view_frame" /> app:layout_constraintTop_toBottomOf="@+id/frame_polar" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -19,7 +19,7 @@
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_pass_geo" android:id="@+id/pass_geo_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
@@ -32,7 +32,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<ImageView <ImageView
android:id="@+id/pass_geo_background" android:id="@+id/pass_geo_bg"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
@@ -19,7 +19,7 @@
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_pass" android:id="@+id/pass_leo_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
@@ -32,7 +32,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<ImageView <ImageView
android:id="@+id/pass_background" android:id="@+id/pass_leo_bg"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
@@ -44,86 +44,86 @@
app:srcCompat="@drawable/card_pass_bg" /> app:srcCompat="@drawable/card_pass_bg" />
<TextView <TextView
android:id="@+id/pass_losAz" android:id="@+id/pass_leo_losAz"
style="@style/CardPassText" style="@style/CardPassText"
android:text="@string/pass_los_az" android:text="@string/pass_los_az"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_maxEl" app:layout_constraintBaseline_toBaselineOf="@+id/pass_leo_maxEl"
app:layout_constraintEnd_toEndOf="@+id/pass_progress" app:layout_constraintEnd_toEndOf="@+id/pass_leo_progress"
app:layout_constraintHorizontal_bias="1.0" app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/pass_maxEl" /> app:layout_constraintStart_toEndOf="@+id/pass_leo_maxEl" />
<TextView <TextView
android:id="@+id/pass_satId" android:id="@+id/pass_leo_satId"
style="@style/CardPassName" style="@style/CardPassName"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="@string/pass_satId" android:text="@string/pass_satId"
app:layout_constraintEnd_toEndOf="@+id/pass_progress" app:layout_constraintEnd_toEndOf="@+id/pass_leo_progress"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/pass_maxEl" android:id="@+id/pass_leo_maxEl"
style="@style/CardPassText" style="@style/CardPassText"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:text="@string/pass_maxEl" android:text="@string/pass_maxEl"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pass_satId" /> app:layout_constraintTop_toBottomOf="@+id/pass_leo_satId" />
<ImageView <ImageView
android:id="@+id/pass_img" android:id="@+id/pass_leo_img"
android:layout_width="20dp" android:layout_width="20dp"
android:layout_height="20dp" android:layout_height="20dp"
android:contentDescription="@string/placeholder" android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toBottomOf="@+id/pass_satName" app:layout_constraintBottom_toBottomOf="@+id/pass_leo_satName"
app:layout_constraintStart_toStartOf="@+id/pass_progress" app:layout_constraintStart_toStartOf="@+id/pass_leo_progress"
app:layout_constraintTop_toTopOf="@+id/pass_satName" app:layout_constraintTop_toTopOf="@+id/pass_leo_satName"
app:srcCompat="@drawable/ic_pass_inactive" /> app:srcCompat="@drawable/ic_pass_inactive" />
<TextView <TextView
android:id="@+id/pass_satName" android:id="@+id/pass_leo_satName"
style="@style/CardPassName" style="@style/CardPassName"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/pass_satName" android:text="@string/pass_satName"
app:layout_constraintBottom_toBottomOf="@+id/pass_satId" app:layout_constraintBottom_toBottomOf="@+id/pass_leo_satId"
app:layout_constraintEnd_toStartOf="@+id/pass_satId" app:layout_constraintEnd_toStartOf="@+id/pass_leo_satId"
app:layout_constraintHorizontal_bias="0.02" app:layout_constraintHorizontal_bias="0.02"
app:layout_constraintStart_toEndOf="@+id/pass_img" app:layout_constraintStart_toEndOf="@+id/pass_leo_img"
app:layout_constraintTop_toTopOf="@+id/pass_satId" /> app:layout_constraintTop_toTopOf="@+id/pass_leo_satId" />
<TextView <TextView
android:id="@+id/pass_aosAz" android:id="@+id/pass_leo_aosAz"
style="@style/CardPassText" style="@style/CardPassText"
android:text="@string/pass_aos_az" android:text="@string/pass_aos_az"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_maxEl" app:layout_constraintBaseline_toBaselineOf="@+id/pass_leo_maxEl"
app:layout_constraintEnd_toStartOf="@+id/pass_maxEl" app:layout_constraintEnd_toStartOf="@+id/pass_leo_maxEl"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/pass_progress" /> app:layout_constraintStart_toStartOf="@+id/pass_leo_progress" />
<TextView <TextView
android:id="@+id/pass_aosTime" android:id="@+id/pass_leo_aosTime"
style="@style/CardPassText" style="@style/CardPassText"
android:text="@string/pass_dateTime" android:text="@string/pass_dateTime"
app:layout_constraintBaseline_toBaselineOf="@+id/pass_losTime" app:layout_constraintBaseline_toBaselineOf="@+id/pass_leo_losTime"
app:layout_constraintEnd_toStartOf="@+id/pass_losTime" app:layout_constraintEnd_toStartOf="@+id/pass_leo_losTime"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="@+id/pass_progress" /> app:layout_constraintStart_toStartOf="@+id/pass_leo_progress" />
<TextView <TextView
android:id="@+id/pass_losTime" android:id="@+id/pass_leo_losTime"
style="@style/CardPassText" style="@style/CardPassText"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:text="@string/pass_dateTime" android:text="@string/pass_dateTime"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/pass_progress" app:layout_constraintEnd_toEndOf="@+id/pass_leo_progress"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pass_aosTime" app:layout_constraintStart_toEndOf="@+id/pass_leo_aosTime"
app:layout_constraintTop_toBottomOf="@+id/pass_progress" /> app:layout_constraintTop_toBottomOf="@+id/pass_leo_progress" />
<ProgressBar <ProgressBar
android:id="@+id/pass_progress" android:id="@+id/pass_leo_progress"
style="?android:attr/progressBarStyleHorizontal" style="?android:attr/progressBarStyleHorizontal"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="14dp" android:layout_height="14dp"
@@ -131,7 +131,7 @@
android:layout_marginEnd="6dp" android:layout_marginEnd="6dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pass_maxEl" /> app:layout_constraintTop_toBottomOf="@+id/pass_leo_maxEl" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
@@ -18,7 +18,7 @@
--> -->
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" <CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sat_entry_item" android:id="@+id/sat_entry_checkbox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="36dp" android:layout_height="36dp"
android:text="@string/placeholder" android:text="@string/placeholder"
@@ -20,7 +20,7 @@
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_trans" android:id="@+id/trans_card"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
+3 -2
View File
@@ -45,6 +45,7 @@ task clean(type: Delete) {
ext { ext {
material = '1.2.0-alpha05' material = '1.2.0-alpha05'
appCompat = '1.1.0'
supportLib = '1.0.0' supportLib = '1.0.0'
constraintLayout = '1.1.3' constraintLayout = '1.1.3'
@@ -56,9 +57,9 @@ ext {
room = '2.2.4' room = '2.2.4'
retrofit = '2.6.2' retrofit = '2.7.1'
dagger = '2.25.2' dagger = '2.26'
predict4java = '1.3.1' predict4java = '1.3.1'
} }