diff --git a/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt index 8819529a..9e73ae89 100644 --- a/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/network/RemoteDataSource.kt @@ -19,6 +19,7 @@ package com.rtbishop.look4sat.network +import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -34,12 +35,14 @@ class RemoteDataSource @Inject constructor( private val client: OkHttpClient ) : RemoteSource { - override suspend fun fetchTleStream(tleUrl: String): InputStream { + override suspend fun fetchTleStream(urlList: List): InputStream { val streamTable = Hashtable() withContext(Dispatchers.IO) { - val request = Request.Builder().url(tleUrl).build() - val stream = client.newCall(request).execute().body()?.byteStream() - streamTable[tleUrl] = stream + urlList.forEach { + val request = Request.Builder().url(it.url).build() + val stream = client.newCall(request).execute().body()?.byteStream() + streamTable[it.url] = stream + } } return SequenceInputStream(streamTable.elements()) } diff --git a/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt b/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt index 65e7654f..50412a07 100644 --- a/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/network/RemoteSource.kt @@ -1,11 +1,12 @@ package com.rtbishop.look4sat.network +import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter import java.io.InputStream interface RemoteSource { - suspend fun fetchTleStream(tleUrl: String): InputStream + suspend fun fetchTleStream(urlList: List): InputStream suspend fun fetchTransmitters(): List } diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt index 60007e11..6c42ce74 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt @@ -23,6 +23,7 @@ import android.content.ContentResolver import android.net.Uri import com.github.amsacode.predict4java.TLE import com.rtbishop.look4sat.data.SatEntry +import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter import com.rtbishop.look4sat.network.RemoteSource import com.rtbishop.look4sat.persistence.LocalSource @@ -46,8 +47,8 @@ class DefaultRepository @Inject constructor( } } - override suspend fun updateEntriesFromUrl(tleUrl: String) { - val stream = remoteSource.fetchTleStream(tleUrl) + override suspend fun updateEntriesFromUrl(urlList: List) { + val stream = remoteSource.fetchTleStream(urlList) withContext(Dispatchers.IO) { val tleList = TLE.importSat(stream) val entries = tleList.map { SatEntry(it) } diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt index 81c68b37..d138732d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt @@ -2,13 +2,14 @@ package com.rtbishop.look4sat.repo import android.net.Uri import com.rtbishop.look4sat.data.SatEntry +import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.data.Transmitter interface Repository { suspend fun updateEntriesFromFile(tleUri: Uri) - suspend fun updateEntriesFromUrl(tleUrl: String) + suspend fun updateEntriesFromUrl(urlList: List) suspend fun getAllEntries(): List diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt index 8d2b24b2..6d0fdd0e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt @@ -28,11 +28,9 @@ import android.net.Uri import android.os.Bundle import android.view.View import android.view.WindowManager -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.core.widget.addTextChangedListener import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -47,7 +45,6 @@ import com.rtbishop.look4sat.dagger.ViewModelFactory import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.databinding.ActivityMainBinding -import com.rtbishop.look4sat.databinding.DialogTleUrlBinding import com.rtbishop.look4sat.databinding.DrawerHeaderBinding import com.rtbishop.look4sat.ui.fragments.TleSourcesDialogFragment import com.rtbishop.look4sat.utility.GeneralUtils.toast @@ -183,26 +180,6 @@ class MainActivity : AppCompatActivity(), TleSourcesDialogFragment.SourcesSubmit drawerBinding.drawerBtnExit.setOnClickListener { finish() } } - private fun showTleUrlDialog() { - val dialogBinding = DialogTleUrlBinding.inflate(layoutInflater) - val dialog = AlertDialog.Builder(this).setView(dialogBinding.root).create() - dialogBinding.apply { - var tleUrl = String() - dialogTleInput.apply { -// hint = viewModel.getTleUrl() - addTextChangedListener { tleUrl = it.toString() } - } - dialogTleNeg.setOnClickListener { - dialog.dismiss() - } - dialogTlePos.setOnClickListener { - viewModel.updateEntriesFromWeb(tleUrl) - dialog.dismiss() - } - } - dialog.show() - } - private fun showTleSourcesDialog() { val sources = viewModel.getTleSources().map { TleSource(it) } TleSourcesDialogFragment(sources).apply { @@ -212,8 +189,7 @@ class MainActivity : AppCompatActivity(), TleSourcesDialogFragment.SourcesSubmit } override fun onSourcesSubmit(list: List) { - val sources = list.map { it.url }.toSet() - viewModel.setTleSource(sources) + viewModel.updateEntriesFromWeb(list) } private fun View.lockButton() { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt index 1f50d76a..4995ff69 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt @@ -26,6 +26,7 @@ import com.github.amsacode.predict4java.GroundStationPosition import com.rtbishop.look4sat.data.Result import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.data.SatPass +import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.repo.Repository import com.rtbishop.look4sat.utility.PassPredictor import com.rtbishop.look4sat.utility.PrefsManager @@ -59,6 +60,7 @@ class SharedViewModel @Inject constructor( fun getRefreshRate() = prefsManager.getRefreshRate() fun getHoursAhead() = prefsManager.getHoursAhead() fun getMinElevation() = prefsManager.getMinElevation() + fun getTleSources() = prefsManager.getTleSources() fun setPositionFromPref() = _gsp.postValue(Result.Success(prefsManager.getPosition())) suspend fun getAllEntries() = repository.getAllEntries() @@ -98,18 +100,15 @@ class SharedViewModel @Inject constructor( } } - fun updateEntriesFromWeb(tleUrl: String? = null) { + fun updateEntriesFromWeb(list: List) { + val sourcesSet = list.map { it.url }.toSet() + prefsManager.setTleSources(sourcesSet) + viewModelScope.launch(Dispatchers.IO) { try { -// val url = if (tleUrl.isNullOrEmpty()) { -// prefsManager.getTleUrl() -// } else { -// prefsManager.setTleUrl(tleUrl) -// tleUrl -// } -// val selected = repository.getSelectedEntries().map { it.catNum } -// repository.updateEntriesFromUrl(url) -// repository.updateEntriesSelection(selected) + val selected = repository.getSelectedEntries().map { it.catNum } + repository.updateEntriesFromUrl(list) + repository.updateEntriesSelection(selected) _updateStatus.postValue(Result.Success(0)) } catch (e: Exception) { _updateStatus.postValue(Result.Error(e)) @@ -117,6 +116,13 @@ class SharedViewModel @Inject constructor( } } + fun updateEntriesSelection(catNumList: MutableList) { + viewModelScope.launch(Dispatchers.IO) { + repository.updateEntriesSelection(catNumList) + calculatePasses() + } + } + fun updateTransmitters() { viewModelScope.launch(Dispatchers.IO) { try { @@ -128,13 +134,6 @@ class SharedViewModel @Inject constructor( } } - fun updateEntriesSelection(catNumList: MutableList) { - viewModelScope.launch(Dispatchers.IO) { - repository.updateEntriesSelection(catNumList) - calculatePasses() - } - } - fun calculatePasses() { _satPassList.postValue(Result.InProgress) calculationJob?.cancel() @@ -150,14 +149,6 @@ class SharedViewModel @Inject constructor( } } - fun getTleSources(): Set { - return prefsManager.getTleSources() - } - - fun setTleSource(sources: Set) { - prefsManager.setTleSources(sources) - } - private fun getPassesForEntries( entry: SatEntry, dateNow: Date, diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TleSourcesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TleSourcesAdapter.kt index c4d566e7..1f1239e5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TleSourcesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/TleSourcesAdapter.kt @@ -19,10 +19,11 @@ package com.rtbishop.look4sat.ui.adapters +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.widget.doAfterTextChanged import androidx.recyclerview.widget.RecyclerView import com.rtbishop.look4sat.data.TleSource import com.rtbishop.look4sat.databinding.ItemTleSourceBinding @@ -33,10 +34,11 @@ class TleSourcesAdapter(private var sources: MutableList) : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TleSourceHolder { val binding = ItemTleSourceBinding .inflate(LayoutInflater.from(parent.context), parent, false) - return TleSourceHolder(binding.root, binding) + return TleSourceHolder(binding.root, binding, TleSourceWatcher()) } override fun onBindViewHolder(holder: TleSourceHolder, position: Int) { + holder.textWatcher.updatePosition(position) holder.bind(sources[position]) } @@ -44,27 +46,46 @@ class TleSourcesAdapter(private var sources: MutableList) : return sources.size } + fun getSources(): MutableList { + return sources + } + fun setSources(list: MutableList) { sources = list notifyDataSetChanged() } - fun getSources(): MutableList { - return sources - } - - inner class TleSourceHolder(itemView: View, private val binding: ItemTleSourceBinding) : + inner class TleSourceHolder( + itemView: View, + val binding: ItemTleSourceBinding, + val textWatcher: TleSourceWatcher + ) : RecyclerView.ViewHolder(itemView) { fun bind(source: TleSource) { binding.tleSourceUrl.setText(source.url) - binding.tleSourceUrl.doAfterTextChanged { - source.url = it.toString() - } + binding.tleSourceUrl.addTextChangedListener(textWatcher) binding.tleSourceBtnDel.setOnClickListener { sources.remove(source) notifyItemRemoved(adapterPosition) } } } + + inner class TleSourceWatcher : TextWatcher { + + private var position = 0 + + fun updatePosition(position: Int) { + this.position = position + } + + override fun afterTextChanged(s: Editable?) {} + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + sources[position].url = s.toString() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/TleSourcesDialogFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/TleSourcesDialogFragment.kt index af00514a..c6927e43 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/TleSourcesDialogFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/TleSourcesDialogFragment.kt @@ -32,7 +32,8 @@ class TleSourcesDialogFragment(sources: List) : AppCompatDialogFragment() { private lateinit var sourcesListener: SourcesSubmitListener - private var sourcesAdapter = TleSourcesAdapter(sources.toMutableList()) + private val emptySource = TleSource("") + private val sourcesAdapter = TleSourcesAdapter(sources.toMutableList()) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val binding = DialogTleSourcesBinding.inflate(requireActivity().layoutInflater) @@ -51,14 +52,16 @@ class TleSourcesDialogFragment(sources: List) : binding.tleSourceBtnAdd.setOnClickListener { val tempSources = sourcesAdapter.getSources() - tempSources.add(TleSource()) + tempSources.add(emptySource) sourcesAdapter.setSources(tempSources) sourcesAdapter.notifyDataSetChanged() } binding.tleSourcesBtnNeg.setOnClickListener { dismiss() } binding.tleSourcesBtnPos.setOnClickListener { - sourcesListener.onSourcesSubmit(sourcesAdapter.getSources()) + val filteredSources = sourcesAdapter.getSources() + .filter { it.url != String() && it.url != " " && it.url.contains("https://") } + sourcesListener.onSourcesSubmit(filteredSources) dismiss() }