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) { override fun onTick(millisUntilFinished: Long) {
timeToAos.text = String.format( 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.toHours(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60, TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(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.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageButton
import androidx.fragment.app.Fragment 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.R
import com.rtbishop.lookingsat.vm.MainViewModel
class SkyFragment : Fragment() { 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( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@@ -16,4 +27,22 @@ class SkyFragment : Fragment() {
): View? { ): View? {
return inflater.inflate(R.layout.fragment_sky, container, false) 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.lifecycle.viewModelScope
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.github.amsacode.predict4java.GroundStationPosition 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.google.android.gms.location.LocationServices
import com.rtbishop.lookingsat.Injector import com.rtbishop.lookingsat.Injector
import com.rtbishop.lookingsat.repo.Repository import com.rtbishop.lookingsat.repo.Repository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.FileNotFoundException
import java.io.IOException import java.io.IOException
import java.util.*
class MainViewModel(application: Application) : AndroidViewModel(application) { class MainViewModel(application: Application) : AndroidViewModel(application) {
private val keyLat = "LATITUDE" private val keyLat = "LATITUDE"
private val keyLon = "LONGITUDE" private val keyLon = "LONGITUDE"
private val keyHeight = "HEIGHT" private val keyHeight = "HEIGHT"
private val tleFile = "tles.txt"
private val repository: Repository = Injector.provideRepository(application) private val repository: Repository = Injector.provideRepository(application)
private val preferences = PreferenceManager.getDefaultSharedPreferences(application) private val preferences = PreferenceManager.getDefaultSharedPreferences(application)
@@ -38,6 +44,19 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
) )
val gsp: LiveData<GroundStationPosition> = _gsp 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() { fun updateLocation() {
fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? -> fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
val lat = location?.latitude ?: 0.0 val lat = location?.latitude ?: 0.0
@@ -56,10 +75,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
} }
fun updateTwoLineElementFile() { fun updateTwoLineElementFile() {
val fileName = "tles.txt"
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
getApplication<Application>().openFileOutput(fileName, Context.MODE_PRIVATE).use { getApplication<Application>().openFileOutput(tleFile, Context.MODE_PRIVATE).use {
it.write(repository.fetchTleStream().readBytes()) it.write(repository.fetchTleStream().readBytes())
} }
_debugMessage.postValue("TLE file was updated") _debugMessage.postValue("TLE file was updated")
+45
View File
@@ -0,0 +1,45 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="180dp"
android:height="52dp"
android:viewportWidth="180"
android:viewportHeight="52">
<path
android:fillAlpha="1"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M90.228,25.867m-18.678,0a18.678,18.678 0,1 1,37.356 0a18.678,18.678 0,1 1,-37.356 0"
android:strokeWidth="1.2"
android:strokeColor="#C0C0C0" />
<path
android:fillColor="#00000000"
android:pathData="m179.999,0.23c-25.023,0.051 -50.046,0.102 -63.817,1.503 -13.771,1.402 -16.29,4.154 -18.809,6.906"
android:strokeWidth="0.8"
android:strokeAlpha="1"
android:strokeColor="#C0C0C0"
android:strokeLineCap="butt"
android:strokeLineJoin="miter" />
<path
android:fillColor="#00000000"
android:pathData="m179.999,51.77c-25.023,-0.051 -50.046,-0.102 -63.817,-1.503 -13.771,-1.402 -16.29,-4.154 -18.809,-6.906"
android:strokeWidth="0.8"
android:strokeAlpha="1"
android:strokeColor="#C0C0C0"
android:strokeLineCap="butt"
android:strokeLineJoin="miter" />
<path
android:fillColor="#00000000"
android:pathData="m0.001,51.77c25.023,-0.051 50.046,-0.102 63.817,-1.503 13.771,-1.402 16.29,-4.154 18.809,-6.906"
android:strokeWidth="0.8"
android:strokeAlpha="1"
android:strokeColor="#C0C0C0"
android:strokeLineCap="butt"
android:strokeLineJoin="miter" />
<path
android:fillColor="#00000000"
android:pathData="m0.001,0.23c25.023,0.051 50.046,0.102 63.817,1.503 13.771,1.402 16.29,4.154 18.809,6.906"
android:strokeWidth="0.8"
android:strokeAlpha="1"
android:strokeColor="#C0C0C0"
android:strokeLineCap="butt"
android:strokeLineJoin="miter" />
</vector>
+6 -6
View File
@@ -35,7 +35,7 @@
<TextView <TextView
android:id="@+id/drawer_lat" android:id="@+id/drawer_lat"
style="@style/DrawerHeader.Item" style="@style/DrawerHeader.Item"
android:text="@string/latitude" android:text="@string/drawer_latitude"
app:layout_constraintBottom_toTopOf="@+id/drawer_lon_value" app:layout_constraintBottom_toTopOf="@+id/drawer_lon_value"
app:layout_constraintStart_toStartOf="@+id/drawer_lon" /> app:layout_constraintStart_toStartOf="@+id/drawer_lon" />
@@ -43,14 +43,14 @@
android:id="@+id/drawer_lat_value" android:id="@+id/drawer_lat_value"
style="@style/DrawerHeader.Value" style="@style/DrawerHeader.Value"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="@string/latitude_def" android:text="@string/drawer_latitude_value"
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lat" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lat"
app:layout_constraintStart_toEndOf="@+id/drawer_lat" /> app:layout_constraintStart_toEndOf="@+id/drawer_lat" />
<TextView <TextView
android:id="@+id/drawer_lon" android:id="@+id/drawer_lon"
style="@style/DrawerHeader.Item" style="@style/DrawerHeader.Item"
android:text="@string/longitude" android:text="@string/drawer_longitude"
app:layout_constraintBottom_toTopOf="@+id/drawer_height_value" app:layout_constraintBottom_toTopOf="@+id/drawer_height_value"
app:layout_constraintStart_toStartOf="@+id/drawer_height" /> app:layout_constraintStart_toStartOf="@+id/drawer_height" />
@@ -58,7 +58,7 @@
android:id="@+id/drawer_lon_value" android:id="@+id/drawer_lon_value"
style="@style/DrawerHeader.Value" style="@style/DrawerHeader.Value"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="@string/longitude_def" android:text="@string/drawer_longitude_value"
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lon" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lon"
app:layout_constraintStart_toEndOf="@+id/drawer_lon" /> app:layout_constraintStart_toEndOf="@+id/drawer_lon" />
@@ -67,7 +67,7 @@
style="@style/DrawerHeader.Item" style="@style/DrawerHeader.Item"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
android:text="@string/height" android:text="@string/drawer_height"
app:layout_constraintBottom_toTopOf="@+id/drawer_btn_loc" app:layout_constraintBottom_toTopOf="@+id/drawer_btn_loc"
app:layout_constraintStart_toStartOf="@+id/drawer_btn_loc" /> app:layout_constraintStart_toStartOf="@+id/drawer_btn_loc" />
@@ -75,7 +75,7 @@
android:id="@+id/drawer_height_value" android:id="@+id/drawer_height_value"
style="@style/DrawerHeader.Value" style="@style/DrawerHeader.Value"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="@string/height_def" android:text="@string/drawer_height_value"
app:layout_constraintBaseline_toBaselineOf="@+id/drawer_height" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_height"
app:layout_constraintStart_toEndOf="@+id/drawer_height" /> app:layout_constraintStart_toEndOf="@+id/drawer_height" />
+9
View File
@@ -6,6 +6,15 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.SkyFragment"> tools:context=".ui.SkyFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_sky"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/sky_fab" android:id="@+id/sky_fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
+83
View File
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
style="@style/CardSatPass"
android:layout_height="104dp"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
app:cardElevation="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_drawing" />
<TextView
android:id="@+id/card_sat_name"
style="@style/CardSatPass.SideText"
android:layout_marginStart="8dp"
android:text="@string/card_sat_name"
app:layout_constraintBottom_toTopOf="@+id/card_max_el"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/card_pass_vector"
style="@style/CardSatPass.SideText"
android:layout_marginStart="8dp"
android:text="@string/card_pass_vector"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/card_max_el" />
<TextView
android:id="@+id/card_max_el"
style="@style/CardSatPass.MaxEl"
android:text="@string/card_max_el"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/card_pass_start"
style="@style/CardSatPass.SideText"
android:layout_marginEnd="8dp"
android:text="@string/card_pass_aos_time"
app:layout_constraintBottom_toTopOf="@+id/card_max_el"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/card_pass_end"
style="@style/CardSatPass.SideText"
android:text="@string/card_pass_los_time"
app:layout_constraintStart_toStartOf="@+id/card_pass_start"
app:layout_constraintTop_toBottomOf="@+id/card_max_el" />
<TextView
android:id="@+id/card_pass_aos"
style="@style/CardSatPass.SideText"
android:layout_marginEnd="4dp"
android:text="@string/card_pass_aos"
app:layout_constraintBaseline_toBaselineOf="@+id/card_pass_start"
app:layout_constraintEnd_toStartOf="@+id/card_pass_start" />
<TextView
android:id="@+id/card_pass_los"
style="@style/CardSatPass.SideText"
android:text="@string/card_pass_los"
app:layout_constraintBaseline_toBaselineOf="@+id/card_pass_end"
app:layout_constraintEnd_toEndOf="@+id/card_pass_aos" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
+16 -10
View File
@@ -3,7 +3,13 @@
<string name="app_name">LookingSat</string> <string name="app_name">LookingSat</string>
<string name="title">L∞king</string> <string name="title">L∞king</string>
<string name="subtitle">S@t</string> <string name="subtitle">S@t</string>
<string name="drawer_header_link">https://github.com/rt-bishop/LookingSat</string>
<string name="drawer_latitude">Latitude: </string>
<string name="drawer_latitude_value">51.5074</string>
<string name="drawer_longitude">Longitude: </string>
<string name="drawer_longitude_value">0.1278</string>
<string name="drawer_height">Height AMSL: </string>
<string name="drawer_height_value">48.0m</string>
<string name="menu_sky">Sky at a Glance</string> <string name="menu_sky">Sky at a Glance</string>
<string name="menu_radar">Radar View</string> <string name="menu_radar">Radar View</string>
@@ -12,17 +18,17 @@
<string name="menu_credits">Credits</string> <string name="menu_credits">Credits</string>
<string name="menu_about">About the App</string> <string name="menu_about">About the App</string>
<string name="latitude">Latitude: </string> <string name="toolbar_aos_in">AOS in %02d:%02d:%02d</string>
<string name="latitude_def">51.5074</string> <string name="toolbar_refresh">Refresh</string>
<string name="longitude">Longitude: </string>
<string name="longitude_def">0.1278</string>
<string name="height">Height AMSL: </string>
<string name="height_def">48.0m</string>
<string name="menu_refresh">Refresh</string> <string name="card_sat_name">Meteor M2–2</string>
<string name="card_pass_vector">V: 180° -> 360°</string>
<string name="card_max_el">75.5°</string>
<string name="card_pass_aos">AOS -</string>
<string name="card_pass_los">LOS -</string>
<string name="card_pass_aos_time">13:14:15</string>
<string name="card_pass_los_time">16:17:18</string>
<string name="next_aos_pattern">AOS in %02d:%02d:%02d</string>
<string name="drawer_locator">Drawer Locator</string>
<string name="map_content">Nasa Map</string> <string name="map_content">Nasa Map</string>
<string name="placeholder">Placeholder</string> <string name="placeholder">Placeholder</string>
<string name="about">About</string> <string name="about">About</string>
+20 -1
View File
@@ -49,7 +49,7 @@
<item name="android:layout_width">wrap_content</item> <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item> <item name="android:gravity">center</item>
<item name="android:text">@string/next_aos_pattern</item> <item name="android:text">@string/toolbar_aos_in</item>
<item name="android:textSize">30sp</item> <item name="android:textSize">30sp</item>
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
<item name="android:textColor">@color/themeAccent</item> <item name="android:textColor">@color/themeAccent</item>
@@ -62,4 +62,23 @@
<item name="android:backgroundTint">@color/toolbarButton</item> <item name="android:backgroundTint">@color/toolbarButton</item>
</style> </style>
<style name="CardSatPass">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">104dp</item>
</style>
<style name="CardSatPass.SideText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">20sp</item>
</style>
<style name="CardSatPass.MaxEl">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">24sp</item>
<item name="android:textColor">@color/themeAccent</item>
<item name="android:textStyle">bold</item>
</style>
</resources> </resources>