mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-05 03:57:24 +00:00
Added SatPass CardView, RecyclerView with SatPasses, moved the code to SkyFragment.
This commit is contained in:
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")
|
||||
|
||||
Reference in new issue
Block a user