From b7291db0f990c4cf360058124f5fccf3dd5b1918 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Thu, 7 Nov 2019 15:42:27 +0100 Subject: [PATCH] Added SatPass CardView, RecyclerView with SatPasses, moved the code to SkyFragment. --- .../rtbishop/lookingsat/ui/MainActivity.kt | 2 +- .../rtbishop/lookingsat/ui/SatPassAdapter.kt | 46 ++++++++++ .../com/rtbishop/lookingsat/ui/SkyFragment.kt | 29 +++++++ .../rtbishop/lookingsat/vm/MainViewModel.kt | 22 ++++- app/src/main/res/drawable/ic_drawing.xml | 45 ++++++++++ app/src/main/res/layout/drawer_header.xml | 12 +-- app/src/main/res/layout/fragment_sky.xml | 9 ++ app/src/main/res/layout/sat_pass_card.xml | 83 +++++++++++++++++++ app/src/main/res/values/strings.xml | 26 +++--- app/src/main/res/values/styles.xml | 21 ++++- 10 files changed, 275 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt create mode 100644 app/src/main/res/drawable/ic_drawing.xml create mode 100644 app/src/main/res/layout/sat_pass_card.xml diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt index 4c3e3cfc..588e6871 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/MainActivity.kt @@ -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 diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt new file mode 100644 index 00000000..105403ee --- /dev/null +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt @@ -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) : + RecyclerView.Adapter() { + + 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(R.id.card_sat_name) + val passVector = holder.itemView.findViewById(R.id.card_pass_vector) + val maxEl = holder.itemView.findViewById(R.id.card_max_el) + val passStart = holder.itemView.findViewById(R.id.card_pass_start) + val passEnd = holder.itemView.findViewById(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?) {} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt index 63b7f005..13f4f012 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt @@ -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 + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt index ea35daf7..024b0bf7 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/vm/MainViewModel.kt @@ -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 = _gsp + fun updateRecycler(): MutableList { + var satPassList = mutableListOf() + try { + val tles = TLE.importSat(getApplication().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().openFileOutput(fileName, Context.MODE_PRIVATE).use { + getApplication().openFileOutput(tleFile, Context.MODE_PRIVATE).use { it.write(repository.fetchTleStream().readBytes()) } _debugMessage.postValue("TLE file was updated") diff --git a/app/src/main/res/drawable/ic_drawing.xml b/app/src/main/res/drawable/ic_drawing.xml new file mode 100644 index 00000000..fe8aa7d2 --- /dev/null +++ b/app/src/main/res/drawable/ic_drawing.xml @@ -0,0 +1,45 @@ + + + + + + + diff --git a/app/src/main/res/layout/drawer_header.xml b/app/src/main/res/layout/drawer_header.xml index aefccfa9..7a361ab2 100644 --- a/app/src/main/res/layout/drawer_header.xml +++ b/app/src/main/res/layout/drawer_header.xml @@ -35,7 +35,7 @@ @@ -43,14 +43,14 @@ android:id="@+id/drawer_lat_value" style="@style/DrawerHeader.Value" android:layout_marginStart="8dp" - android:text="@string/latitude_def" + android:text="@string/drawer_latitude_value" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lat" app:layout_constraintStart_toEndOf="@+id/drawer_lat" /> @@ -58,7 +58,7 @@ android:id="@+id/drawer_lon_value" style="@style/DrawerHeader.Value" android:layout_marginStart="8dp" - android:text="@string/longitude_def" + android:text="@string/drawer_longitude_value" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_lon" app:layout_constraintStart_toEndOf="@+id/drawer_lon" /> @@ -67,7 +67,7 @@ style="@style/DrawerHeader.Item" android:layout_marginStart="4dp" android:layout_marginBottom="4dp" - android:text="@string/height" + android:text="@string/drawer_height" app:layout_constraintBottom_toTopOf="@+id/drawer_btn_loc" app:layout_constraintStart_toStartOf="@+id/drawer_btn_loc" /> @@ -75,7 +75,7 @@ android:id="@+id/drawer_height_value" style="@style/DrawerHeader.Value" android:layout_marginStart="8dp" - android:text="@string/height_def" + android:text="@string/drawer_height_value" app:layout_constraintBaseline_toBaselineOf="@+id/drawer_height" app:layout_constraintStart_toEndOf="@+id/drawer_height" /> diff --git a/app/src/main/res/layout/fragment_sky.xml b/app/src/main/res/layout/fragment_sky.xml index a1ca4b6a..cd2eae29 100644 --- a/app/src/main/res/layout/fragment_sky.xml +++ b/app/src/main/res/layout/fragment_sky.xml @@ -6,6 +6,15 @@ android:layout_height="match_parent" tools:context=".ui.SkyFragment"> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f561a911..7707d4aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,7 +3,13 @@ LookingSat L∞king S@t - https://github.com/rt-bishop/LookingSat + + Latitude: + 51.5074 + Longitude: + 0.1278 + Height AMSL: + 48.0m Sky at a Glance Radar View @@ -12,17 +18,17 @@ Credits About the App - Latitude: - 51.5074 - Longitude: - 0.1278 - Height AMSL: - 48.0m + AOS in %02d:%02d:%02d + Refresh - Refresh + Meteor M2–2 + V: 180° -> 360° + 75.5° + AOS - + LOS - + 13:14:15 + 16:17:18 - AOS in %02d:%02d:%02d - Drawer Locator Nasa Map Placeholder About diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ed360ef6..8aa8f1e3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -49,7 +49,7 @@ wrap_content wrap_content center - @string/next_aos_pattern + @string/toolbar_aos_in 30sp bold @color/themeAccent @@ -62,4 +62,23 @@ @color/toolbarButton + + + + + +