Added SatPass CardView, RecyclerView with SatPasses, moved the code to SkyFragment.

This commit is contained in:
Arty Bishop committed 2019-11-07 15:42:27 +01:00
1 parent 7510453f39
commit b7291db0f9
10 files changed
+275 -20

No files matched your search

@@ -140,7 +140,7 @@ class MainActivity : AppCompatActivity() {
override fun onTick(millisUntilFinished: Long) {
timeToAos.text = String.format(
resources.getString(R.string.next_aos_pattern),
resources.getString(R.string.toolbar_aos_in),
TimeUnit.MILLISECONDS.toHours(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60
@@ -0,0 +1,46 @@
package com.rtbishop.lookingsat.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.github.amsacode.predict4java.SatPassTime
import com.rtbishop.lookingsat.R
import java.text.SimpleDateFormat
import java.util.*
class SatPassAdapter(private val satPassList: MutableList<SatPassTime>) :
RecyclerView.Adapter<SatPassAdapter.ViewHolder>() {
override fun getItemCount(): Int {
return satPassList.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView =
LayoutInflater.from(parent.context).inflate(R.layout.sat_pass_card, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val satPass = satPassList[position]
val satName = holder.itemView.findViewById<TextView>(R.id.card_sat_name)
val passVector = holder.itemView.findViewById<TextView>(R.id.card_pass_vector)
val maxEl = holder.itemView.findViewById<TextView>(R.id.card_max_el)
val passStart = holder.itemView.findViewById<TextView>(R.id.card_pass_start)
val passEnd = holder.itemView.findViewById<TextView>(R.id.card_pass_end)
satName.text = String.format("%s", "Meteor M2-2")
passVector.text = String.format("V: %02d° -> %02d°", satPass.aosAzimuth, satPass.losAzimuth)
maxEl.text = String.format("%.1f°", satPass.maxEl)
passStart.text = SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.startTime)
passEnd.text = SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.endTime)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
override fun onClick(v: View?) {}
}
}
@@ -4,11 +4,22 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.lookingsat.R
import com.rtbishop.lookingsat.vm.MainViewModel
class SkyFragment : Fragment() {
private lateinit var viewModel: MainViewModel
private lateinit var recView: RecyclerView
private lateinit var recAdapter: RecyclerView.Adapter<*>
private lateinit var recLayoutManager: RecyclerView.LayoutManager
private lateinit var btnRefresh: ImageButton
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -16,4 +27,22 @@ class SkyFragment : Fragment() {
): View? {
return inflater.inflate(R.layout.fragment_sky, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java)
btnRefresh = (activity as MainActivity).findViewById(R.id.toolbar_btn_refresh)
btnRefresh.setOnClickListener {
val satPassList = viewModel.updateRecycler()
recLayoutManager = LinearLayoutManager(activity)
recAdapter = SatPassAdapter(satPassList)
recView = view.findViewById(R.id.recycler_sky)
recView.setHasFixedSize(true)
recView.layoutManager = recLayoutManager
recView.adapter = recAdapter
}
}
}
@@ -11,18 +11,24 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import androidx.preference.PreferenceManager
import com.github.amsacode.predict4java.GroundStationPosition
import com.github.amsacode.predict4java.PassPredictor
import com.github.amsacode.predict4java.SatPassTime
import com.github.amsacode.predict4java.TLE
import com.google.android.gms.location.LocationServices
import com.rtbishop.lookingsat.Injector
import com.rtbishop.lookingsat.repo.Repository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.FileNotFoundException
import java.io.IOException
import java.util.*
class MainViewModel(application: Application) : AndroidViewModel(application) {
private val keyLat = "LATITUDE"
private val keyLon = "LONGITUDE"
private val keyHeight = "HEIGHT"
private val tleFile = "tles.txt"
private val repository: Repository = Injector.provideRepository(application)
private val preferences = PreferenceManager.getDefaultSharedPreferences(application)
@@ -38,6 +44,19 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
)
val gsp: LiveData<GroundStationPosition> = _gsp
fun updateRecycler(): MutableList<SatPassTime> {
var satPassList = mutableListOf<SatPassTime>()
try {
val tles = TLE.importSat(getApplication<Application>().openFileInput(tleFile))
val passPredictor = PassPredictor(tles[0], _gsp.value)
satPassList = passPredictor.getPasses(Date(), 6, false)
} catch (exception: FileNotFoundException) {
_debugMessage.postValue("TLE file wasn't found")
}
return satPassList
}
fun updateLocation() {
fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
val lat = location?.latitude ?: 0.0
@@ -56,10 +75,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
}
fun updateTwoLineElementFile() {
val fileName = "tles.txt"
viewModelScope.launch(Dispatchers.IO) {
try {
getApplication<Application>().openFileOutput(fileName, Context.MODE_PRIVATE).use {
getApplication<Application>().openFileOutput(tleFile, Context.MODE_PRIVATE).use {
it.write(repository.fetchTleStream().readBytes())
}
_debugMessage.postValue("TLE file was updated")